Skip to content

fix false-positive unconsumed event in hook loop replay#1778

Merged
TooTallNate merged 1 commit intomainfrom
fix/unconsumed-event-hook-loop
Apr 16, 2026
Merged

fix false-positive unconsumed event in hook loop replay#1778
TooTallNate merged 1 commit intomainfrom
fix/unconsumed-event-hook-loop

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

Summary

  • fix the deferred unconsumed-event check to yield once after the first promise-queue drain, then re-read the latest queue before reporting an orphaned event
  • add a deterministic runWorkflow regression for for await hook loops where the next payload hydration is appended after a prior step resolves
  • include a patch changeset for @workflow/core

Testing

  • pnpm vitest run src/events-consumer.test.ts
  • pnpm vitest run src/workflow.test.ts
  • pnpm vitest run src/hook-sleep-interaction.test.ts

Copilot AI review requested due to automatic review settings April 16, 2026 18:43
@TooTallNate TooTallNate requested a review from a team as a code owner April 16, 2026 18:43
@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Apr 16, 2026

🦋 Changeset detected

Latest commit: a71b1ed

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

This PR includes changesets to release 17 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
@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 Apr 16, 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 Apr 16, 2026 6:47pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Apr 16, 2026 6:47pm
example-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-astro-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-express-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-fastify-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-hono-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-nitro-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-nuxt-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workbench-vite-workflow Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Apr 16, 2026 6:47pm
workflow-swc-playground Ready Ready Preview, Comment Apr 16, 2026 6:47pm
workflow-web Ready Ready Preview, Comment Apr 16, 2026 6:47pm

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 16, 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.005s (~) 0.963s 10 1.00x
💻 Local Express 0.043s (-2.5%) 1.005s (~) 0.962s 10 1.04x
💻 Local Next.js (Turbopack) 0.046s 1.005s 0.959s 10 1.12x
🐘 Postgres Next.js (Turbopack) 0.059s 1.010s 0.951s 10 1.41x
🐘 Postgres Nitro 0.061s (-35.4% 🟢) 1.010s (-3.1%) 0.949s 10 1.48x
🐘 Postgres Express 0.064s (+9.5% 🔺) 1.010s (~) 0.946s 10 1.53x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.240s (-4.4%) 2.165s (-7.2% 🟢) 1.924s 10 1.00x
▲ Vercel Nitro 0.258s (-37.1% 🟢) 1.904s (-24.1% 🟢) 1.647s 10 1.07x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.116s 2.006s 0.890s 10 1.00x
💻 Local Nitro 1.125s (-0.6%) 2.006s (~) 0.881s 10 1.01x
💻 Local Express 1.127s (~) 2.005s (~) 0.879s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.131s 2.009s 0.878s 10 1.01x
🐘 Postgres Express 1.153s (+0.5%) 2.010s (~) 0.857s 10 1.03x
🐘 Postgres Nitro 1.159s (+1.6%) 2.026s (+0.8%) 0.867s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.845s (-1.2%) 5.623s (-4.8%) 1.778s 10 1.00x
▲ Vercel Next.js (Turbopack) 4.117s (+102.3% 🔺) 5.996s (+56.5% 🔺) 1.879s 10 1.07x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 10.786s 11.024s 0.238s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.883s 11.022s 0.139s 3 1.01x
🐘 Postgres Nitro 10.885s (~) 11.021s (~) 0.136s 3 1.01x
💻 Local Nitro 10.903s (~) 11.022s (~) 0.120s 3 1.01x
💻 Local Express 10.922s (~) 11.023s (~) 0.101s 3 1.01x
🐘 Postgres Express 10.946s (~) 11.025s (~) 0.078s 3 1.01x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 29.839s (+25.7% 🔺) 31.428s (+25.1% 🔺) 1.589s 1 1.00x
▲ Vercel Next.js (Turbopack) 33.258s (+92.0% 🔺) 34.677s (+78.8% 🔺) 1.419s 1 1.11x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 14.435s 15.024s 0.588s 4 1.00x
🐘 Postgres Nitro 14.591s (~) 15.025s (~) 0.433s 4 1.01x
🐘 Postgres Express 14.691s (+0.7%) 15.021s (~) 0.330s 4 1.02x
💻 Local Next.js (Turbopack) 14.696s 15.029s 0.333s 4 1.02x
💻 Local Nitro 14.980s (-0.5%) 15.029s (-6.2% 🟢) 0.048s 4 1.04x
💻 Local Express 14.994s (~) 15.280s (+1.7%) 0.286s 4 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 45.911s (-12.7% 🟢) 48.480s (-11.2% 🟢) 2.569s 2 1.00x
▲ Vercel Nitro 48.507s (-24.7% 🟢) 50.627s (-24.0% 🟢) 2.120s 2 1.06x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 13.763s 14.020s 0.257s 7 1.00x
🐘 Postgres Nitro 14.231s (+1.9%) 15.028s (+5.0% 🔺) 0.797s 6 1.03x
🐘 Postgres Express 14.714s (+5.0% 🔺) 15.193s (+4.1%) 0.479s 6 1.07x
💻 Local Next.js (Turbopack) 16.054s 16.697s 0.643s 6 1.17x
💻 Local Nitro 16.618s (-1.0%) 17.030s (~) 0.412s 6 1.21x
💻 Local Express 16.760s (+1.0%) 17.032s (~) 0.272s 6 1.22x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 76.763s (-80.5% 🟢) 78.720s (-80.1% 🟢) 1.957s 2 1.00x
▲ Vercel Nitro 88.480s (-79.1% 🟢) 90.110s (-78.8% 🟢) 1.630s 2 1.15x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.238s 2.009s 0.771s 15 1.00x
🐘 Postgres Nitro 1.263s (-0.9%) 2.009s (~) 0.747s 15 1.02x
🐘 Postgres Express 1.434s (+13.8% 🔺) 2.076s (+3.3%) 0.641s 15 1.16x
💻 Local Nitro 1.500s (-8.1% 🟢) 2.006s (-3.3%) 0.507s 15 1.21x
💻 Local Express 1.524s (+2.4%) 2.005s (~) 0.481s 15 1.23x
💻 Local Next.js (Turbopack) 1.534s 2.005s 0.471s 15 1.24x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 4.050s (+19.2% 🔺) 5.893s (+19.5% 🔺) 1.843s 6 1.00x
▲ Vercel Nitro 4.268s (+51.5% 🔺) 5.538s (+28.1% 🔺) 1.270s 6 1.05x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.360s (~) 3.010s (~) 0.650s 10 1.00x
🐘 Postgres Next.js (Turbopack) 2.419s 3.009s 0.590s 10 1.03x
🐘 Postgres Express 2.469s (+4.6%) 3.112s (+3.4%) 0.643s 10 1.05x
💻 Local Nitro 2.820s (-10.3% 🟢) 3.007s (-22.6% 🟢) 0.187s 10 1.20x
💻 Local Next.js (Turbopack) 2.842s 3.453s 0.611s 9 1.20x
💻 Local Express 3.062s (+3.7%) 3.564s (+3.2%) 0.502s 9 1.30x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.900s (-28.4% 🟢) 4.294s (-27.5% 🟢) 1.394s 7 1.00x
▲ Vercel Next.js (Turbopack) 3.353s (-52.8% 🟢) 4.952s (-44.4% 🟢) 1.599s 7 1.16x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.465s (~) 4.012s (~) 0.547s 8 1.00x
🐘 Postgres Express 3.566s (+2.3%) 4.133s (+3.1%) 0.568s 8 1.03x
🐘 Postgres Next.js (Turbopack) 3.688s 4.013s 0.325s 8 1.06x
💻 Local Next.js (Turbopack) 7.649s 8.268s 0.619s 4 2.21x
💻 Local Nitro 8.025s (-3.9%) 8.277s (-8.2% 🟢) 0.252s 4 2.32x
💻 Local Express 8.742s (+4.8%) 9.021s (~) 0.279s 4 2.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 4.459s (-50.0% 🟢) 6.366s (-41.9% 🟢) 1.907s 5 1.00x
▲ Vercel Nitro 6.889s (+95.4% 🔺) 8.319s (+50.3% 🔺) 1.430s 4 1.54x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 1.241s 2.009s 0.769s 15 1.00x
🐘 Postgres Nitro 1.259s (~) 2.009s (~) 0.750s 15 1.02x
🐘 Postgres Express 1.282s (+2.0%) 2.007s (~) 0.725s 15 1.03x
💻 Local Next.js (Turbopack) 1.462s 2.006s 0.543s 15 1.18x
💻 Local Nitro 1.528s (-18.1% 🟢) 2.005s (-14.3% 🟢) 0.477s 15 1.23x
💻 Local Express 1.533s (-19.0% 🟢) 2.006s (-15.1% 🟢) 0.473s 15 1.24x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.162s (+7.8% 🔺) 4.962s (+6.9% 🔺) 1.800s 7 1.00x
▲ Vercel Nitro 3.881s (+57.8% 🔺) 5.511s (+32.2% 🔺) 1.630s 6 1.23x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.347s (~) 3.010s (~) 0.663s 10 1.00x
🐘 Postgres Nitro 2.349s (~) 3.009s (~) 0.660s 10 1.00x
🐘 Postgres Next.js (Turbopack) 2.414s 3.009s 0.595s 10 1.03x
💻 Local Next.js (Turbopack) 2.889s 3.453s 0.564s 9 1.23x
💻 Local Nitro 3.006s (-1.9%) 3.566s (-8.3% 🟢) 0.560s 9 1.28x
💻 Local Express 3.078s (-1.7%) 4.013s (+6.7% 🔺) 0.936s 8 1.31x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.588s (+14.2% 🔺) 5.329s (+17.8% 🔺) 1.741s 6 1.00x
▲ Vercel Nitro 3.909s (+20.9% 🔺) 5.448s (+7.3% 🔺) 1.538s 7 1.09x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 3.478s (-0.6%) 4.009s (~) 0.531s 8 1.00x
🐘 Postgres Nitro 3.497s (~) 4.011s (~) 0.515s 8 1.01x
🐘 Postgres Next.js (Turbopack) 3.683s 4.013s 0.330s 8 1.06x
💻 Local Next.js (Turbopack) 7.730s 8.018s 0.288s 4 2.22x
💻 Local Nitro 8.558s (-6.4% 🟢) 9.028s (-9.9% 🟢) 0.470s 4 2.46x
💻 Local Express 9.377s (+6.5% 🔺) 10.026s (+8.1% 🔺) 0.649s 3 2.70x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 8.138s (+20.4% 🔺) 10.035s (+17.5% 🔺) 1.897s 3 1.00x
▲ Vercel Nitro 16.330s (+220.6% 🔺) 17.937s (+163.1% 🔺) 1.607s 2 2.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.805s 1.007s 0.201s 60 1.00x
🐘 Postgres Nitro 0.821s (~) 1.023s (+1.7%) 0.202s 59 1.02x
🐘 Postgres Express 0.844s (+0.6%) 1.023s (~) 0.179s 59 1.05x
💻 Local Next.js (Turbopack) 0.846s 1.022s 0.176s 59 1.05x
💻 Local Nitro 0.986s (+0.6%) 1.116s (+2.0%) 0.129s 54 1.22x
💻 Local Express 0.999s (+1.5%) 1.434s (+33.2% 🔺) 0.435s 42 1.24x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 21.965s (+51.4% 🔺) 23.795s (+47.9% 🔺) 1.830s 3 1.00x
▲ Vercel Nitro 29.462s (+33.6% 🔺) 31.716s (+32.0% 🔺) 2.254s 2 1.34x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.936s (~) 2.175s (+3.5%) 0.238s 42 1.00x
🐘 Postgres Next.js (Turbopack) 1.954s 2.203s 0.249s 41 1.01x
🐘 Postgres Express 1.991s (+0.7%) 2.316s (+2.6%) 0.325s 39 1.03x
💻 Local Next.js (Turbopack) 2.646s 3.008s 0.362s 30 1.37x
💻 Local Nitro 3.012s (-0.8%) 3.648s (-2.9%) 0.637s 25 1.56x
💻 Local Express 3.111s (+3.1%) 4.010s (+11.8% 🔺) 0.900s 23 1.61x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 70.808s (+79.3% 🔺) 72.292s (+75.1% 🔺) 1.484s 2 1.00x
▲ Vercel Next.js (Turbopack) 343.672s (+590.1% 🔺) 346.086s (+569.2% 🔺) 2.414s 1 4.85x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 3.881s 4.110s 0.228s 30 1.00x
🐘 Postgres Express 4.091s (+2.5%) 4.891s (+11.9% 🔺) 0.800s 25 1.05x
🐘 Postgres Nitro 4.091s (~) 4.852s (+5.4% 🔺) 0.761s 25 1.05x
💻 Local Next.js (Turbopack) 8.624s 9.089s 0.465s 14 2.22x
💻 Local Nitro 9.080s (-2.3%) 9.788s (-2.3%) 0.707s 13 2.34x
💻 Local Express 9.409s (+2.2%) 10.019s (~) 0.610s 12 2.42x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 108.146s (+11.6% 🔺) 109.930s (+11.7% 🔺) 1.784s 2 1.00x
▲ Vercel Next.js (Turbopack) 130.855s (+22.1% 🔺) 133.162s (+22.3% 🔺) 2.307s 1 1.21x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.252s 1.007s 0.755s 60 1.00x
🐘 Postgres Express 0.294s (+4.2%) 1.007s (~) 0.713s 60 1.17x
🐘 Postgres Nitro 0.299s (+5.7% 🔺) 1.007s (~) 0.708s 60 1.19x
💻 Local Next.js (Turbopack) 0.562s 1.005s 0.442s 60 2.23x
💻 Local Nitro 0.574s (-5.0% 🟢) 1.004s (-1.7%) 0.430s 60 2.28x
💻 Local Express 0.609s (+8.7% 🔺) 1.005s (~) 0.396s 60 2.41x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.052s (+23.5% 🔺) 3.728s (+11.3% 🔺) 1.676s 17 1.00x
▲ Vercel Next.js (Turbopack) 2.069s (+2.3%) 3.666s (-3.4%) 1.596s 17 1.01x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 0.498s 1.006s 0.508s 90 1.00x
🐘 Postgres Express 0.501s (-1.6%) 1.007s (~) 0.505s 90 1.01x
🐘 Postgres Nitro 0.506s (+1.9%) 1.007s (~) 0.501s 90 1.01x
💻 Local Nitro 2.480s (-2.3%) 3.009s (~) 0.529s 30 4.97x
💻 Local Express 2.541s (+1.1%) 3.009s (~) 0.468s 30 5.10x
💻 Local Next.js (Turbopack) 2.562s 3.008s 0.446s 30 5.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.266s (+1.3%) 4.787s (-0.7%) 1.521s 19 1.00x
▲ Vercel Next.js (Turbopack) 4.158s (+17.6% 🔺) 5.787s (+11.4% 🔺) 1.629s 16 1.27x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.811s (-1.0%) 1.018s (~) 0.207s 118 1.00x
🐘 Postgres Nitro 0.819s (+3.6%) 1.026s (+1.9%) 0.208s 117 1.01x
🐘 Postgres Next.js (Turbopack) 0.869s 1.091s 0.223s 110 1.07x
💻 Local Next.js (Turbopack) 10.844s 11.301s 0.457s 11 13.38x
💻 Local Nitro 10.883s (-2.7%) 11.484s (-1.5%) 0.602s 11 13.43x
💻 Local Express 11.329s (+1.2%) 11.939s (~) 0.610s 11 13.98x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 6.918s (-10.4% 🟢) 8.774s (-6.7% 🟢) 1.855s 14 1.00x
▲ Vercel Next.js (Turbopack) 7.786s (-24.6% 🟢) 9.508s (-22.6% 🟢) 1.721s 13 1.13x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 0.177s 1.003s 0.012s 1.018s 0.841s 10 1.00x
💻 Local Nitro 0.204s (-4.7%) 1.004s (~) 0.011s (-9.6% 🟢) 1.017s (~) 0.814s 10 1.15x
💻 Local Express 0.204s (+2.6%) 1.004s (~) 0.013s (+4.1%) 1.019s (~) 0.814s 10 1.15x
🐘 Postgres Nitro 0.207s (+1.1%) 1.000s (~) 0.001s (-6.7% 🟢) 1.012s (~) 0.805s 10 1.17x
🐘 Postgres Next.js (Turbopack) 0.208s 1.001s 0.001s 1.010s 0.802s 10 1.18x
🐘 Postgres Express 0.228s (+10.9% 🔺) 1.000s (~) 0.001s (-37.5% 🟢) 1.009s (~) 0.782s 10 1.28x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.483s (-49.2% 🟢) 4.903s (-43.3% 🟢) 1.078s (+70.5% 🔺) 6.461s (-34.0% 🟢) 2.979s 10 1.00x
▲ Vercel Nitro 4.736s (+23.6% 🔺) 6.213s (+17.7% 🔺) 0.743s (~) 7.425s (+14.5% 🔺) 2.689s 10 1.36x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.614s (-1.5%) 1.008s (~) 0.005s (+18.0% 🔺) 1.024s (~) 0.410s 59 1.00x
🐘 Postgres Express 0.640s (+1.7%) 1.006s (~) 0.004s (+0.9%) 1.023s (~) 0.382s 59 1.04x
🐘 Postgres Next.js (Turbopack) 0.689s 1.011s 0.005s 1.025s 0.336s 59 1.12x
💻 Local Nitro 0.734s (-12.5% 🟢) 1.012s (~) 0.009s (-1.2%) 1.023s (-8.3% 🟢) 0.289s 59 1.19x
💻 Local Next.js (Turbopack) 0.745s 1.012s 0.009s 1.117s 0.373s 54 1.21x
💻 Local Express 0.869s (+14.7% 🔺) 1.013s (-1.5%) 0.010s (+4.9%) 1.118s (+7.5% 🔺) 0.249s 54 1.41x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.408s (-81.6% 🟢) 7.119s (-76.9% 🟢) 0.551s (+392.1% 🔺) 8.400s (-73.6% 🟢) 2.992s 8 1.00x
▲ Vercel Next.js (Turbopack) 6.474s (-61.7% 🟢) 8.100s (-55.6% 🟢) 0.241s (+14.1% 🔺) 8.841s (-53.3% 🟢) 2.367s 7 1.20x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.956s (-1.3%) 1.198s (-3.9%) 0.000s (+140.0% 🔺) 1.208s (-3.9%) 0.252s 50 1.00x
🐘 Postgres Express 0.971s (+1.0%) 1.215s (-4.9%) 0.000s (-8.0% 🟢) 1.228s (-6.0% 🟢) 0.258s 50 1.02x
🐘 Postgres Next.js (Turbopack) 1.026s 1.540s 0.000s 1.549s 0.524s 39 1.07x
💻 Local Nitro 1.209s (-1.1%) 2.020s (~) 0.000s (+200.0% 🔺) 2.021s (~) 0.813s 30 1.26x
💻 Local Next.js (Turbopack) 1.256s 2.019s 0.000s 2.022s 0.766s 30 1.31x
💻 Local Express 1.277s (+4.3%) 2.022s (~) 0.001s (+60.0% 🔺) 2.024s (~) 0.747s 30 1.34x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.468s (-65.9% 🟢) 4.950s (-57.0% 🟢) 0.000s (NaN%) 5.398s (-55.2% 🟢) 1.930s 12 1.00x
▲ Vercel Nitro 3.540s (+16.0% 🔺) 4.845s (+10.3% 🔺) 0.000s (-100.0% 🟢) 5.345s (+11.1% 🔺) 1.805s 12 1.02x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.782s (+0.6%) 2.134s (-2.0%) 0.000s (+Infinity% 🔺) 2.147s (-2.3%) 0.365s 29 1.00x
🐘 Postgres Nitro 1.822s (+1.7%) 2.262s (+5.7% 🔺) 0.000s (+211.1% 🔺) 2.279s (+4.8%) 0.458s 27 1.02x
🐘 Postgres Next.js (Turbopack) 1.906s 2.146s 0.000s 2.156s 0.250s 28 1.07x
💻 Local Nitro 3.768s (+11.2% 🔺) 4.104s (+1.8%) 0.001s (-6.2% 🟢) 4.465s (+10.6% 🔺) 0.697s 14 2.11x
💻 Local Next.js (Turbopack) 3.866s 4.392s 0.001s 4.399s 0.533s 14 2.17x
💻 Local Express 4.375s (+26.2% 🔺) 4.248s (+5.3% 🔺) 0.001s (+51.8% 🔺) 4.967s (+23.0% 🔺) 0.592s 14 2.46x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 4.375s (-22.1% 🟢) 5.795s (-17.0% 🟢) 0.000s (-100.0% 🟢) 6.256s (-17.0% 🟢) 1.881s 10 1.00x
▲ Vercel Nitro 5.655s (+38.1% 🔺) 7.383s (+37.4% 🔺) 0.000s (-100.0% 🟢) 7.822s (+35.0% 🔺) 2.167s 8 1.29x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Next.js (Turbopack) 14/21
🐘 Postgres Next.js (Turbopack) 11/21
▲ Vercel Next.js (Turbopack) 12/21
Fastest World by Framework

Winner determined by most benchmark wins

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 16, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 923 0 67 990
✅ 💻 Local Development 994 0 86 1080
✅ 📦 Local Production 994 0 86 1080
✅ 🐘 Local Postgres 994 0 86 1080
✅ 🪟 Windows 90 0 0 90
❌ 🌍 Community Worlds 133 98 0 231
✅ 📋 Other 252 0 18 270
Total 4380 98 343 4821

❌ Failed Tests

🌍 Community Worlds (98 failed)

mongodb (15 failed):

  • readableStreamWorkflow | wrun_01KPC1EW6RTF074X9DJ1HCXD18
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KPC1FJQCTYF9E4KDPB6HSTXM
  • webhookWorkflow | wrun_01KPC1FV1QJBQX4ES68GGP6N91
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KPC1K7NR5NFTNX9ETC6RFVGF
  • fetchWorkflow | wrun_01KPC1KMX0P6GCP8YW9YYC7J8Q
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KPC1QQH59VP03CVEK7YYCB6K
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KPC1Y3QCMPFBCZ3X1VZ9205X

redis (15 failed):

  • readableStreamWorkflow | wrun_01KPC1EW6RTF074X9DJ1HCXD18
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KPC1FJQCTYF9E4KDPB6HSTXM
  • webhookWorkflow | wrun_01KPC1FV1QJBQX4ES68GGP6N91
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KPC1K7NR5NFTNX9ETC6RFVGF
  • fetchWorkflow | wrun_01KPC1KMX0P6GCP8YW9YYC7J8Q
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KPC1QQH59VP03CVEK7YYCB6K
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KPC1Y3QCMPFBCZ3X1VZ9205X

turso (68 failed):

  • addTenWorkflow | wrun_01KPC1EBZ8X2A1V7NB9NV5VNCD
  • addTenWorkflow | wrun_01KPC1EBZ8X2A1V7NB9NV5VNCD
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KPBSV87DVRCD6P88P2BYGMZF
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KPC1EJAQD0M0PY6NFN49JZFA
  • promiseRaceWorkflow | wrun_01KPC1EQCTX6MZDBYEAW8CZWS7
  • promiseAnyWorkflow | wrun_01KPC1ES6DM7ZD76TCSKVRGHH2
  • importedStepOnlyWorkflow | wrun_01KPBSVM383H0XG7H6AREDQM6A
  • readableStreamWorkflow | wrun_01KPC1EW6RTF074X9DJ1HCXD18
  • hookWorkflow | wrun_01KPC1F6T2DT8C23QC0R422XAW
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KPC1FJQCTYF9E4KDPB6HSTXM
  • webhookWorkflow | wrun_01KPC1FV1QJBQX4ES68GGP6N91
  • sleepingWorkflow | wrun_01KPC1G0Z9A1JYF5AP0K03XFGR
  • parallelSleepWorkflow | wrun_01KPC1GD6M907B1FBH4PMSKHME
  • nullByteWorkflow | wrun_01KPC1GH8VFSVK1SMF22ZR3EVA
  • workflowAndStepMetadataWorkflow | wrun_01KPC1GK8TVWK010X2GFFWWFT9
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KPC1K7NR5NFTNX9ETC6RFVGF
  • fetchWorkflow | wrun_01KPC1KMX0P6GCP8YW9YYC7J8Q
  • promiseRaceStressTestWorkflow | wrun_01KPC1KS3SJBFR23YQM0SDNEN8
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KPC1Q4P0570QT0087PHTBX82
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KPC1QQH59VP03CVEK7YYCB6K
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KPC1RB7R679ZXB1S5CW43NBD
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KPC1RXVBSJVATMP2DSYBETX1
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KPC1S74HMFERBMSWMYDXCP5C
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KPC1SD6S5DM0R0ZXE0CWV56K
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KPC1SF5GYRKQJ3MKA1K94QYN
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KPC1SVKDW5Z7KW1GNHEHST9E
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KPC1TAS5GWX3SEKQT6335B7H
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KPC1TFYP30TKTQEXCG0NQARE
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KPC1TP0R3RH720A25FVHWGDY
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KPC1TVZRTAD8K06A4R19VYVM
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KPC1V1PM8VKVPQFWAQX1GEEN
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KPC1V7YDFV4S93J2RYGA8WDE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KPC1VG7Z8W44FA285KMAS561
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KPC1VT3M8S46AR6041HC2GJR
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KPC1W24AQZ199GS7N46TQFF2
  • cancelRun - cancelling a running workflow | wrun_01KPC1W89KV93HEAHGJ8VBPH68
  • cancelRun via CLI - cancelling a running workflow | wrun_01KPC1WGQVSJM1691V7A14XVVX
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KPC1WVXN6C12H2X9DAE56H7B
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KPC1XG333W0ANGCSKXHM5CQ8
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KPC1XSYVNXSWBX09B7YS3DKB
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KPC1XZVJ3NYVBK6D0EZG59J0
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KPC1Y1R60WJMR9EJJCJ0YWK7
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KPC1Y3QCMPFBCZ3X1VZ9205X
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KPC1Y6S127812X07QB1RFCEE

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 83 0 7
✅ example 83 0 7
✅ express 83 0 7
✅ fastify 83 0 7
✅ hono 83 0 7
✅ nextjs-turbopack 88 0 2
✅ nextjs-webpack 88 0 2
✅ nitro 83 0 7
✅ nuxt 83 0 7
✅ sveltekit 83 0 7
✅ vite 83 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 84 0 6
✅ express-stable 84 0 6
✅ fastify-stable 84 0 6
✅ hono-stable 84 0 6
✅ nextjs-turbopack-canary 71 0 19
✅ nextjs-turbopack-stable 90 0 0
✅ nextjs-webpack-canary 71 0 19
✅ nextjs-webpack-stable 90 0 0
✅ nitro-stable 84 0 6
✅ nuxt-stable 84 0 6
✅ sveltekit-stable 84 0 6
✅ vite-stable 84 0 6
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 84 0 6
✅ express-stable 84 0 6
✅ fastify-stable 84 0 6
✅ hono-stable 84 0 6
✅ nextjs-turbopack-canary 71 0 19
✅ nextjs-turbopack-stable 90 0 0
✅ nextjs-webpack-canary 71 0 19
✅ nextjs-webpack-stable 90 0 0
✅ nitro-stable 84 0 6
✅ nuxt-stable 84 0 6
✅ sveltekit-stable 84 0 6
✅ vite-stable 84 0 6
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 84 0 6
✅ express-stable 84 0 6
✅ fastify-stable 84 0 6
✅ hono-stable 84 0 6
✅ nextjs-turbopack-canary 71 0 19
✅ nextjs-turbopack-stable 90 0 0
✅ nextjs-webpack-canary 71 0 19
✅ nextjs-webpack-stable 90 0 0
✅ nitro-stable 84 0 6
✅ nuxt-stable 84 0 6
✅ sveltekit-stable 84 0 6
✅ vite-stable 84 0 6
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 90 0 0
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 6 0 0
❌ mongodb 56 15 0
✅ redis-dev 6 0 0
❌ redis 56 15 0
✅ turso-dev 6 0 0
❌ turso 3 68 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 84 0 6
✅ e2e-local-postgres-nest-stable 84 0 6
✅ e2e-local-prod-nest-stable 84 0 6

📋 View full workflow run

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Fixes a false-positive “unconsumed event” report during workflow replay when a for await hook loop schedules follow-up async work after the initial promise-queue drain.

Changes:

  • Updates EventsConsumer’s deferred unconsumed-event check to yield once, then re-read the promise queue before reporting an orphaned event.
  • Adds a runWorkflow regression test covering delayed hook payload hydration in a for await loop (ensuring the second step_created isn’t incorrectly flagged).
  • Adds a patch changeset for @workflow/core.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

File Description
packages/core/src/workflow.test.ts Adds a targeted regression test reproducing the hook loop replay timing scenario.
packages/core/src/events-consumer.ts Adjusts the deferred orphan-event check to avoid racing with newly appended async work.
.changeset/fix-hook-loop-unconsumed-event.md Publishes the fix as a patch release note for @workflow/core.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

const processPayload = globalThis[Symbol.for("WORKFLOW_USE_STEP")]("processPayload");
async function workflow() {
const hook = createHook({ token: 'test-token' });
void sleep('1d');
Copy link

Copilot AI Apr 16, 2026

Choose a reason for hiding this comment

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

void sleep('1d') creates a wait invocation that is never completed in the provided event log (only wait_created exists). This will leave a pending wait in invocationsQueue and triggers warnPendingQueueItems() on workflow completion, making the test noisy and potentially flaky if warnings are treated as failures. Consider removing the un-awaited sleep, or add a matching wait_completed event (and/or await the sleep) so the queue is clean at the end of the run.

Suggested change
void sleep('1d');

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious left a comment

Choose a reason for hiding this comment

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

LGTM best I can tell from testing it. I need a longer session to really dig into the event consumer

@TooTallNate TooTallNate merged commit b7d6595 into main Apr 16, 2026
226 of 238 checks passed
@TooTallNate TooTallNate deleted the fix/unconsumed-event-hook-loop branch April 16, 2026 22:05
@TooTallNate TooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 16, 2026
@ghost ghost mentioned this pull request Apr 16, 2026
@ghost
Copy link
Copy Markdown

ghost commented Apr 16, 2026

Backported to stable (b7d6595 -> 7aab36b).

ghost pushed a commit that referenced this pull request Apr 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stable Cherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants