Skip to content

[ai] Drop orphan UI chunks after negative-index reconnect#2082

Open
VaguelySerious wants to merge 4 commits into
mainfrom
peter/issue-1835-client-orphan-filter
Open

[ai] Drop orphan UI chunks after negative-index reconnect#2082
VaguelySerious wants to merge 4 commits into
mainfrom
peter/issue-1835-client-orphan-filter

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 22, 2026

Addressed part of #1835 by ensuring WorkflowChatTransport never fails when using startIndex between chunk boundaries, and adds an example code snippet for how to do server-side rewinds.

Issue: When WorkflowChatTransport resumes with a negative initialStartIndex, the resolved chunk index can land in the middle of an open text-* / reasoning-* / tool-input-* part. AI SDK's client enforces the *-start → *-delta → *-end grammar and throws on the orphan delta — breaking the chat.

This PR adds a one-pass filter on the resumed stream that drops chunks referencing a part whose start chunk wasn't in the resumed window, and emits a one-time warning pointing at docs on server-side rewinding. The filter only activates for negative startIndex — for non-negative values the caller is explicit and we trust them.

When `WorkflowChatTransport` resumes with a negative `initialStartIndex`,
the resolved chunk can land in the middle of an open `text-*` / `reasoning-*`
/ `tool-input-*` part. AI SDK's client enforces the start→delta→end grammar
and throws on the orphan delta, breaking the chat.

Add a one-pass filter on the resumed stream that drops chunks referencing
a part whose start chunk wasn't in the resumed window, and warn once with
a pointer to docs on server-side rewinding. Filter only activates for
negative startIndex — non-negative is the caller's explicit choice.

Refs: #1835

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

vercel Bot commented May 22, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment May 22, 2026 11:49am
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 22, 2026 11:49am
example-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-astro-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-express-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-fastify-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-hono-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-nitro-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-nuxt-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-sveltekit-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workbench-vite-workflow Ready Ready Preview, Comment May 22, 2026 11:49am
workflow-docs Ready Ready Preview, Comment, Open in v0 May 22, 2026 11:49am
workflow-swc-playground Ready Ready Preview, Comment May 22, 2026 11:49am
workflow-tarballs Ready Ready Preview, Comment May 22, 2026 11:49am
workflow-web Ready Ready Preview, Comment May 22, 2026 11:49am

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 22, 2026

🦋 Changeset detected

Latest commit: 3bdac11

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

This PR includes changesets to release 1 package
Name Type
@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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

🧪 E2E Test Results

All tests passed

Summary

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

Details by Category

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

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 22, 2026

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.030s (-31.8% 🟢) 1.006s (~) 0.976s 10 1.00x
💻 Local Nitro 0.031s (-29.0% 🟢) 1.005s (~) 0.975s 10 1.01x
💻 Local Next.js (Turbopack) 0.046s 1.005s 0.959s 10 1.54x
🐘 Postgres Nitro 0.048s (-49.2% 🟢) 1.013s (-2.9%) 0.964s 10 1.60x
🐘 Postgres Express 0.051s (-11.6% 🟢) 1.013s (~) 0.962s 10 1.70x
🐘 Postgres Next.js (Turbopack) 0.055s 1.012s 0.956s 10 1.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.233s (-7.6% 🟢) 1.809s (-22.5% 🟢) 1.577s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.071s (-5.3% 🟢) 2.006s (~) 0.935s 10 1.00x
💻 Local Express 1.075s (-4.5%) 2.006s (~) 0.932s 10 1.00x
🐘 Postgres Express 1.081s (-5.7% 🟢) 2.008s (~) 0.927s 10 1.01x
🐘 Postgres Nitro 1.087s (-4.6%) 2.009s (~) 0.922s 10 1.02x
💻 Local Next.js (Turbopack) 1.112s 2.006s 0.894s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.119s 2.008s 0.889s 10 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 1.704s (-16.3% 🟢) 6.835s (+78.4% 🔺) 5.131s 10 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 10.403s (-5.1% 🟢) 11.018s (~) 0.615s 3 1.00x
💻 Local Nitro 10.407s (-4.9%) 11.022s (~) 0.616s 3 1.00x
🐘 Postgres Nitro 10.417s (-4.2%) 11.010s (~) 0.593s 3 1.00x
💻 Local Express 10.423s (-4.6%) 11.022s (~) 0.599s 3 1.00x
🐘 Postgres Next.js (Turbopack) 10.710s 11.017s 0.306s 3 1.03x
💻 Local Next.js (Turbopack) 10.718s 11.021s 0.304s 3 1.03x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 14.105s (-18.6% 🟢) 16.246s (-16.3% 🟢) 2.141s 2 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 13.454s (-7.7% 🟢) 14.019s (-6.7% 🟢) 0.564s 5 1.00x
🐘 Postgres Nitro 13.482s (-7.6% 🟢) 14.015s (-6.7% 🟢) 0.532s 5 1.00x
💻 Local Express 13.488s (-9.9% 🟢) 14.026s (-6.7% 🟢) 0.538s 5 1.00x
💻 Local Nitro 13.490s (-10.4% 🟢) 14.027s (-12.5% 🟢) 0.537s 5 1.00x
💻 Local Next.js (Turbopack) 14.057s 15.030s 0.973s 4 1.04x
🐘 Postgres Next.js (Turbopack) 14.156s 15.016s 0.860s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 23.299s (-55.7% 🟢) 25.425s (-53.4% 🟢) 2.125s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 11.907s (-15.0% 🟢) 12.140s (-16.8% 🟢) 0.233s 8 1.00x
💻 Local Express 11.920s (-28.2% 🟢) 12.022s (-29.4% 🟢) 0.102s 8 1.00x
💻 Local Nitro 11.950s (-28.8% 🟢) 12.396s (-27.2% 🟢) 0.447s 8 1.00x
🐘 Postgres Nitro 11.950s (-14.4% 🟢) 12.142s (-15.1% 🟢) 0.193s 8 1.00x
🐘 Postgres Next.js (Turbopack) 13.050s 13.872s 0.822s 7 1.10x
💻 Local Next.js (Turbopack) 13.129s 14.027s 0.898s 7 1.10x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 34.010s (-91.4% 🟢) 36.364s (-90.8% 🟢) 2.354s 3 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.143s (-9.3% 🟢) 2.008s (~) 0.865s 15 1.00x
🐘 Postgres Nitro 1.164s (-8.7% 🟢) 2.007s (~) 0.843s 15 1.02x
💻 Local Nitro 1.169s (-28.4% 🟢) 2.007s (-3.3%) 0.838s 15 1.02x
💻 Local Express 1.175s (-21.1% 🟢) 2.006s (~) 0.831s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.211s 2.008s 0.796s 15 1.06x
💻 Local Next.js (Turbopack) 1.283s 2.006s 0.723s 15 1.12x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.611s (-23.2% 🟢) 4.030s (-18.3% 🟢) 1.420s 8 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.201s (-49.1% 🟢) 2.007s (-33.3% 🟢) 0.806s 15 1.00x
🐘 Postgres Nitro 1.221s (-48.0% 🟢) 2.007s (-33.3% 🟢) 0.786s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.341s 2.007s 0.666s 15 1.12x
💻 Local Nitro 1.752s (-44.3% 🟢) 2.007s (-48.3% 🟢) 0.254s 15 1.46x
💻 Local Express 1.781s (-39.7% 🟢) 2.006s (-41.9% 🟢) 0.225s 15 1.48x
💻 Local Next.js (Turbopack) 1.826s 2.007s 0.180s 15 1.52x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 4.093s (-42.4% 🟢) 5.800s (-34.9% 🟢) 1.707s 6 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.314s (-62.3% 🟢) 2.009s (-49.9% 🟢) 0.695s 15 1.00x
🐘 Postgres Nitro 1.324s (-61.9% 🟢) 2.007s (-49.9% 🟢) 0.683s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.600s 2.006s 0.406s 15 1.22x
💻 Local Nitro 4.947s (-40.8% 🟢) 5.512s (-38.9% 🟢) 0.565s 6 3.77x
💻 Local Express 5.118s (-38.6% 🟢) 5.679s (-37.1% 🟢) 0.561s 6 3.90x
💻 Local Next.js (Turbopack) 5.723s 6.213s 0.490s 5 4.36x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.337s (-28.9% 🟢) 8.191s (-25.3% 🟢) 1.854s 4 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.149s (-8.6% 🟢) 2.008s (~) 0.860s 15 1.00x
🐘 Postgres Express 1.151s (-8.4% 🟢) 2.008s (~) 0.857s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.202s 2.009s 0.808s 15 1.05x
💻 Local Next.js (Turbopack) 1.321s 2.006s 0.685s 15 1.15x
💻 Local Nitro 1.368s (-26.7% 🟢) 2.006s (-14.3% 🟢) 0.637s 15 1.19x
💻 Local Express 1.374s (-27.4% 🟢) 2.006s (-15.1% 🟢) 0.632s 15 1.20x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.785s (-5.0%) 4.318s (-7.0% 🟢) 1.533s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.194s (-49.0% 🟢) 2.008s (-33.3% 🟢) 0.813s 15 1.00x
🐘 Postgres Nitro 1.206s (-48.4% 🟢) 2.008s (-33.3% 🟢) 0.801s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.377s 2.006s 0.629s 15 1.15x
💻 Local Nitro 1.998s (-34.8% 🟢) 2.392s (-38.4% 🟢) 0.394s 13 1.67x
💻 Local Express 2.053s (-34.4% 🟢) 2.508s (-33.3% 🟢) 0.455s 12 1.72x
💻 Local Next.js (Turbopack) 2.122s 3.008s 0.887s 10 1.78x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.568s (+13.5% 🔺) 5.498s (+21.6% 🔺) 1.930s 6 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.315s (-62.4% 🟢) 2.007s (-50.0% 🟢) 0.691s 15 1.00x
🐘 Postgres Nitro 1.318s (-62.1% 🟢) 2.007s (-49.9% 🟢) 0.690s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.661s 2.073s 0.412s 15 1.26x
💻 Local Nitro 5.818s (-36.4% 🟢) 6.415s (-36.0% 🟢) 0.596s 5 4.42x
💻 Local Express 5.884s (-33.1% 🟢) 6.416s (-30.8% 🟢) 0.531s 5 4.47x
💻 Local Next.js (Turbopack) 5.988s 6.416s 0.428s 5 4.55x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.965s (-11.7% 🟢) 7.607s (-11.0% 🟢) 1.642s 4 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.454s (-44.7% 🟢) 1.007s (~) 0.553s 60 1.00x
💻 Local Express 0.473s (-51.9% 🟢) 1.004s (-6.7% 🟢) 0.531s 60 1.04x
🐘 Postgres Express 0.478s (-43.0% 🟢) 1.023s (~) 0.545s 59 1.05x
💻 Local Nitro 0.483s (-50.7% 🟢) 1.004s (-8.2% 🟢) 0.521s 60 1.06x
🐘 Postgres Next.js (Turbopack) 0.673s 1.006s 0.333s 60 1.48x
💻 Local Next.js (Turbopack) 0.714s 1.005s 0.290s 60 1.57x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.898s (-59.3% 🟢) 7.645s (-52.5% 🟢) 1.747s 8 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack)

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.094s (-44.7% 🟢) 1.705s (-24.5% 🟢) 0.611s 53 1.00x
🐘 Postgres Nitro 1.136s (-41.1% 🟢) 1.986s (-5.5% 🟢) 0.850s 46 1.04x
💻 Local Express 1.189s (-60.6% 🟢) 2.006s (-44.0% 🟢) 0.817s 45 1.09x
💻 Local Nitro 1.219s (-59.8% 🟢) 2.006s (-46.6% 🟢) 0.787s 45 1.11x
🐘 Postgres Next.js (Turbopack) 1.579s 2.007s 0.428s 45 1.44x
💻 Local Next.js (Turbopack) 1.770s 2.006s 0.236s 45 1.62x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 14.683s (-70.5% 🟢) 16.947s (-67.2% 🟢) 2.264s 6 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.015s (-49.5% 🟢) 2.360s (-46.0% 🟢) 0.345s 51 1.00x
🐘 Postgres Nitro 2.203s (-46.3% 🟢) 2.845s (-38.2% 🟢) 0.643s 43 1.09x
💻 Local Express 2.726s (-70.4% 🟢) 3.058s (-69.5% 🟢) 0.332s 40 1.35x
💻 Local Nitro 2.741s (-70.5% 🟢) 3.032s (-69.7% 🟢) 0.291s 40 1.36x
🐘 Postgres Next.js (Turbopack) 3.101s 4.008s 0.907s 30 1.54x
💻 Local Next.js (Turbopack) 3.877s 4.108s 0.231s 30 1.92x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 27.632s (-74.2% 🟢) 29.576s (-72.8% 🟢) 1.944s 5 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.184s (-34.9% 🟢) 1.006s (~) 0.822s 60 1.00x
🐘 Postgres Express 0.214s (-24.3% 🟢) 1.006s (~) 0.792s 60 1.16x
🐘 Postgres Next.js (Turbopack) 0.225s 1.006s 0.781s 60 1.22x
💻 Local Express 0.395s (-29.5% 🟢) 1.004s (~) 0.609s 60 2.14x
💻 Local Nitro 0.419s (-30.7% 🟢) 1.004s (-1.7%) 0.585s 60 2.27x
💻 Local Next.js (Turbopack) 0.547s 1.005s 0.457s 60 2.97x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.098s (+53.2% 🔺) 5.233s (+38.0% 🔺) 2.136s 12 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.292s (-42.8% 🟢) 1.006s (~) 0.714s 90 1.00x
🐘 Postgres Nitro 0.304s (-38.8% 🟢) 1.006s (~) 0.703s 90 1.04x
🐘 Postgres Next.js (Turbopack) 0.434s 1.006s 0.573s 90 1.49x
💻 Local Nitro 2.141s (-15.7% 🟢) 2.714s (-9.8% 🟢) 0.573s 34 7.34x
💻 Local Express 2.176s (-13.4% 🟢) 2.796s (-7.1% 🟢) 0.621s 33 7.46x
💻 Local Next.js (Turbopack) 2.334s 3.010s 0.676s 30 8.00x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.565s (+85.7% 🔺) 8.571s (+65.0% 🔺) 2.006s 11 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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.604s (-26.2% 🟢) 1.006s (-1.1%) 0.401s 120 1.00x
🐘 Postgres Nitro 0.650s (-17.8% 🟢) 1.006s (~) 0.356s 120 1.07x
🐘 Postgres Next.js (Turbopack) 0.891s 1.069s 0.178s 113 1.47x
💻 Local Nitro 10.189s (-8.9% 🟢) 10.695s (-8.3% 🟢) 0.506s 12 16.86x
💻 Local Express 10.262s (-8.3% 🟢) 10.777s (-9.7% 🟢) 0.514s 12 16.98x
💻 Local Next.js (Turbopack) 10.775s 11.390s 0.615s 11 17.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 15.945s (+54.4% 🔺) 18.310s (+49.0% 🔺) 2.365s 7 1.00x
▲ Vercel Express ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: 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
🐘 Postgres 🥇 Express 1.129s (+450.7% 🔺) 2.001s (+100.3% 🔺) 0.001s (-12.5% 🟢) 2.010s (+98.7% 🔺) 0.880s 10 1.00x
💻 Local Nitro 1.132s (+429.7% 🔺) 2.005s (+99.6% 🔺) 0.012s (-3.2%) 2.020s (+98.2% 🔺) 0.888s 10 1.00x
💻 Local Express 1.136s (+470.5% 🔺) 2.005s (+99.6% 🔺) 0.012s (+2.5%) 2.020s (+98.4% 🔺) 0.884s 10 1.01x
🐘 Postgres Nitro 1.147s (+459.4% 🔺) 2.000s (+100.1% 🔺) 0.001s (-20.0% 🟢) 2.010s (+98.7% 🔺) 0.863s 10 1.02x
💻 Local Next.js (Turbopack) 1.175s 2.003s 0.013s 2.020s 0.845s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.192s 2.001s 0.001s 2.011s 0.819s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.357s (-65.6% 🟢) 3.697s (-57.3% 🟢) 2.371s (+275.2% 🔺) 6.508s (-33.5% 🟢) 4.151s 10 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack)

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.504s (+138.7% 🔺) 2.005s (+99.2% 🔺) 0.004s (+2.7%) 2.025s (+98.0% 🔺) 0.521s 30 1.00x
💻 Local Nitro 1.551s (+84.9% 🔺) 2.012s (+98.8% 🔺) 0.011s (+15.3% 🔺) 2.025s (+81.4% 🔺) 0.474s 30 1.03x
🐘 Postgres Nitro 1.552s (+148.6% 🔺) 2.005s (+99.2% 🔺) 0.004s (-6.5% 🟢) 2.026s (+98.2% 🔺) 0.474s 30 1.03x
🐘 Postgres Next.js (Turbopack) 1.654s 2.011s 0.004s 2.026s 0.372s 30 1.10x
💻 Local Next.js (Turbopack) 1.857s 2.009s 0.011s 2.202s 0.345s 28 1.24x
💻 Local Express 1.937s (+155.9% 🔺) 2.011s (+95.4% 🔺) 0.009s (-4.0%) 2.423s (+133.0% 🔺) 0.486s 25 1.29x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.208s (-63.3% 🟢) 7.333s (-59.8% 🟢) 0.361s (+70.7% 🔺) 8.186s (-56.8% 🟢) 1.978s 8 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack)

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.627s (-34.8% 🟢) 1.012s (-20.8% 🟢) 0.000s (-20.7% 🟢) 1.040s (-20.4% 🟢) 0.413s 58 1.00x
🐘 Postgres Nitro 0.662s (-31.7% 🟢) 1.014s (-18.8% 🟢) 0.000s (-100.0% 🟢) 1.023s (-18.6% 🟢) 0.361s 59 1.06x
🐘 Postgres Next.js (Turbopack) 0.757s 1.053s 0.000s 1.060s 0.304s 57 1.21x
💻 Local Express 1.350s (+10.2% 🔺) 2.015s (~) 0.000s (~) 2.018s (~) 0.668s 30 2.15x
💻 Local Nitro 1.372s (+12.2% 🔺) 2.015s (~) 0.000s (+100.0% 🔺) 2.017s (~) 0.644s 30 2.19x
💻 Local Next.js (Turbopack) 1.427s 2.014s 0.000s 2.017s 0.590s 30 2.28x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.573s (-64.9% 🟢) 5.382s (-53.3% 🟢) 0.000s (+Infinity% 🔺) 5.845s (-51.5% 🟢) 2.272s 11 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: 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.316s (-26.6% 🟢) 2.066s (-3.5%) 0.000s (-3.4%) 2.086s (-4.1%) 0.770s 29 1.00x
🐘 Postgres Express 1.324s (-25.3% 🟢) 1.996s (-8.4% 🟢) 0.000s (+Infinity% 🔺) 2.037s (-7.4% 🟢) 0.713s 30 1.01x
🐘 Postgres Next.js (Turbopack) 1.543s 2.070s 0.000s 2.092s 0.548s 29 1.17x
💻 Local Next.js (Turbopack) 2.775s 3.284s 0.001s 3.296s 0.521s 19 2.11x
💻 Local Express 3.131s (-9.7% 🟢) 4.024s (~) 0.001s (-8.3% 🟢) 4.030s (~) 0.899s 15 2.38x
💻 Local Nitro 3.140s (-7.3% 🟢) 3.907s (-3.1%) 0.001s (+110.9% 🔺) 3.910s (-3.1%) 0.771s 16 2.39x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.723s (+1.9%) 7.845s (+12.4% 🔺) 0.000s (-100.0% 🟢) 8.348s (+10.7% 🔺) 2.626s 8 1.00x
▲ Vercel Express ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

resumable-streams.mdx (both v4 and v5) now only flags the gotcha briefly
and links to the WorkflowChatTransport API reference, which carries the
full explanation and a server-rewind example.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Comment thread .changeset/orphan-ui-chunks-on-resume.md Outdated
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@VaguelySerious VaguelySerious marked this pull request as ready for review May 22, 2026 12:21
@VaguelySerious VaguelySerious requested a review from a team as a code owner May 22, 2026 12:21
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