Skip to content

fix(changesets): only major-bump peer dependents when out of range#2439

Merged
pranaygp merged 1 commit into
mainfrom
pgp/changeset-peer-dependents-out-of-range
Jun 15, 2026
Merged

fix(changesets): only major-bump peer dependents when out of range#2439
pranaygp merged 1 commit into
mainfrom
pgp/changeset-peer-dependents-out-of-range

Conversation

@pranaygp

Copy link
Copy Markdown
Contributor

Problem

@workflow/ai was accidentally published to the latest (stable) dist-tag as 5.0.0, 6.0.0, and 7.0.0 — full majors — even though it had no breaking changes and the rest of the SDK is on the 4.x stable line.

Root cause

@workflow/ai declares workflow as a peer dependency:

// packages/ai/package.json
"peerDependencies": { "workflow": "workspace:^" }

Changesets' default behavior (@changesets/assemble-release-plan@6.0.9) force-bumps a package a full major whenever one of its peer dependencies takes a minor/major bump — regardless of whether the new version is still in range. This is gated by onlyUpdatePeerDependentsWhenOutOfRange, which defaults to false.

On stable (regular changeset mode), three ordinary workflow minors dragged @workflow/ai up a major each time, with no real ai changes:

stable release workflow @workflow/ai
#2203 → 4.3.0 (minor) 4.1.2 → 5.0.0
#2221 → 4.4.0 (minor) 6.0.0
#2352 → 4.5.0 (minor) 7.0.0

main never showed it because pre-release mode absorbs all bumps into the 5.0.0-beta.N line.

Fix

Set onlyUpdatePeerDependentsWhenOutOfRange: true. Now @workflow/ai only major-bumps when a new workflow version actually leaves its ^4 peer range (i.e. a real workflow major), which is the correct semver behavior.

@workflow/ai is the only package in the repo with an internal workspace: peer dependency, so it's the only one affected.

Related

  • The matching change for stable's .changeset/config.json, plus the @workflow/ai version recovery (reset to 4.x, deprecate 5/6/7), ships in a separate PR against stable. The backport bot may open a redundant config-only PR for this commit — close it in favor of that one.

🤖 Generated with Claude Code

@workflow/ai declares `workflow` as a peerDependency. By default,
changesets force-bumps a package a full major whenever a peer
dependency takes a minor/major bump, regardless of whether the new
version is still within the declared range
(`onlyUpdatePeerDependentsWhenOutOfRange` defaults to false).

On the `stable` branch (regular changeset mode) this caused three
ordinary `workflow` minors (4.3.0/4.4.0/4.5.0) to drag @workflow/ai
to 5.0.0/6.0.0/7.0.0 with no real changes. Setting the option to
true makes the major bump fire only when a new `workflow` version
actually leaves @workflow/ai's `^4` peer range.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings June 15, 2026 22:39
@pranaygp pranaygp requested a review from a team as a code owner June 15, 2026 22:39
@changeset-bot

changeset-bot Bot commented Jun 15, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 71e0ccd

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

This PR includes changesets to release 0 packages

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

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@vercel

vercel Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

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 Jun 15, 2026 10:41pm
example-nextjs-workflow-webpack Building Building Preview, Comment Jun 15, 2026 10:41pm
example-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-astro-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-express-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-fastify-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-hono-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-nitro-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-nuxt-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workbench-vite-workflow Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workflow-swc-playground Building Building Preview, Comment Jun 15, 2026 10:41pm
workflow-tarballs Ready Ready Preview, Comment Jun 15, 2026 10:41pm
workflow-web Ready Ready Preview, Comment Jun 15, 2026 10:41pm

@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1440 2 219 1661
✅ 💻 Local Development 1895 0 219 2114
✅ 📦 Local Production 1895 0 219 2114
❌ 🐘 Local Postgres 1880 1 233 2114
✅ 🪟 Windows 151 0 0 151
✅ 📋 Other 879 0 178 1057
Total 8140 3 1068 9211

❌ Failed Tests

▲ Vercel Production (2 failed)

express (1 failed):

  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals

sveltekit (1 failed):

  • error handling error propagation step errors cross-file step error preserves message and function names in stack
🐘 Local Postgres (1 failed)

nitro-stable (1 failed):

  • experimental_setAttributes fire-and-forget: void experimental_setAttributes lands without awaiting

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 26
✅ example 125 0 26
❌ express 124 1 26
✅ fastify 125 0 26
✅ hono 125 0 26
✅ nextjs-turbopack 149 0 2
✅ nextjs-webpack 149 0 2
✅ nitro 125 0 26
✅ nuxt 125 0 26
❌ sveltekit 143 1 7
✅ vite 125 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 126 0 25
✅ express-stable 126 0 25
✅ fastify-stable 126 0 25
✅ hono-stable 126 0 25
✅ nextjs-turbopack-canary 132 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 151 0 0
✅ nextjs-webpack-canary 132 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 151 0 0
✅ nitro-stable 126 0 25
✅ nuxt-stable 126 0 25
✅ sveltekit-stable 145 0 6
✅ vite-stable 126 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 126 0 25
✅ express-stable 126 0 25
✅ fastify-stable 126 0 25
✅ hono-stable 126 0 25
✅ nextjs-turbopack-canary 132 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 151 0 0
✅ nextjs-webpack-canary 132 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 151 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 151 0 0
✅ nitro-stable 126 0 25
✅ nuxt-stable 126 0 25
✅ sveltekit-stable 145 0 6
✅ vite-stable 126 0 25
❌ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 125 0 26
✅ express-stable 125 0 26
✅ fastify-stable 125 0 26
✅ hono-stable 125 0 26
✅ nextjs-turbopack-canary 131 0 20
✅ nextjs-turbopack-stable-lazy-discovery-disabled 150 0 1
✅ nextjs-turbopack-stable-lazy-discovery-enabled 150 0 1
✅ nextjs-webpack-canary 131 0 20
✅ nextjs-webpack-stable-lazy-discovery-disabled 150 0 1
✅ nextjs-webpack-stable-lazy-discovery-enabled 150 0 1
❌ nitro-stable 124 1 26
✅ nuxt-stable 125 0 26
✅ sveltekit-stable 144 0 7
✅ vite-stable 125 0 26
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 151 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 126 0 25
✅ e2e-local-dev-tanstack-start- 126 0 25
✅ e2e-local-postgres-nest-stable 125 0 26
✅ e2e-local-postgres-tanstack-start- 125 0 26
✅ e2e-local-prod-nest-stable 126 0 25
✅ e2e-local-prod-tanstack-start- 126 0 25
✅ e2e-vercel-prod-tanstack-start 125 0 26

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions

github-actions Bot commented Jun 15, 2026

Copy link
Copy Markdown
Contributor

📊 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.044s (+4.1%) 1.006s (~) 0.963s 10 1.00x
💻 Local Express 0.044s (-9.5% 🟢) 1.006s (~) 0.962s 10 1.00x
🐘 Postgres Express 0.058s (-5.6% 🟢) 1.012s (~) 0.954s 10 1.32x
💻 Local Next.js (Turbopack) 0.064s (+4.4%) 1.006s (~) 0.943s 10 1.46x
🐘 Postgres Next.js (Turbopack) 0.068s (-6.0% 🟢) 1.012s (~) 0.943s 10 1.57x
🐘 Postgres Nitro 0.085s (+30.6% 🔺) 1.034s (+2.1%) 0.950s 10 1.94x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.309s (-48.5% 🟢) 2.303s (-13.4% 🟢) 1.994s 10 1.00x
▲ Vercel Express 0.319s (-71.2% 🟢) 2.089s (-41.6% 🟢) 1.770s 10 1.03x
▲ Vercel Next.js (Turbopack) 0.361s (-81.8% 🟢) 2.285s (-44.3% 🟢) 1.923s 10 1.17x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.098s (~) 2.006s (~) 0.909s 10 1.00x
🐘 Postgres Nitro 1.098s (-1.8%) 2.008s (~) 0.910s 10 1.00x
💻 Local Express 1.101s (~) 2.007s (~) 0.906s 10 1.00x
🐘 Postgres Express 1.105s (-0.9%) 2.011s (~) 0.906s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.138s (-1.7%) 2.009s (~) 0.871s 10 1.04x
💻 Local Next.js (Turbopack) 1.140s (~) 2.006s (~) 0.867s 10 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 1.891s (-29.5% 🟢) 3.731s (-17.5% 🟢) 1.841s 10 1.00x
▲ Vercel Nitro 2.126s (-24.7% 🟢) 3.948s (-13.2% 🟢) 1.821s 10 1.12x
▲ Vercel Express 2.141s (-20.1% 🟢) 3.696s (-26.1% 🟢) 1.555s 10 1.13x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 10.443s (-1.2%) 11.021s (~) 0.578s 3 1.00x
🐘 Postgres Express 10.516s (~) 11.019s (~) 0.502s 3 1.01x
💻 Local Nitro 10.535s (~) 11.023s (~) 0.488s 3 1.01x
💻 Local Express 10.537s (~) 11.023s (~) 0.486s 3 1.01x
💻 Local Next.js (Turbopack) 10.795s (~) 11.022s (~) 0.227s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.841s (~) 11.018s (~) 0.177s 3 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 14.732s (-9.4% 🟢) 16.201s (-13.0% 🟢) 1.469s 2 1.00x
▲ Vercel Nitro 14.925s (-17.8% 🟢) 16.299s (-18.0% 🟢) 1.374s 2 1.01x
▲ Vercel Next.js (Turbopack) 16.692s (-22.0% 🟢) 18.756s (-19.4% 🟢) 2.064s 2 1.13x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.714s (-0.9%) 14.028s (~) 0.314s 5 1.00x
💻 Local Nitro 13.759s (-0.6%) 14.027s (~) 0.268s 5 1.00x
🐘 Postgres Nitro 13.792s (-0.6%) 14.434s (+2.9%) 0.641s 5 1.01x
🐘 Postgres Express 13.803s (~) 14.218s (+1.4%) 0.416s 5 1.01x
💻 Local Next.js (Turbopack) 14.428s (~) 15.031s (~) 0.603s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.503s (~) 15.017s (~) 0.514s 4 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 23.074s (-25.1% 🟢) 24.446s (-25.6% 🟢) 1.372s 3 1.00x
▲ Vercel Nitro 24.883s (-24.5% 🟢) 26.407s (-24.2% 🟢) 1.524s 3 1.08x
▲ Vercel Express 25.937s (-25.7% 🟢) 27.343s (-25.9% 🟢) 1.407s 3 1.12x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 12.156s (-4.2%) 12.875s (-1.1%) 0.719s 7 1.00x
🐘 Postgres Express 12.374s (-1.7%) 13.017s (~) 0.644s 7 1.02x
💻 Local Express 12.440s (-1.4%) 13.025s (~) 0.585s 7 1.02x
💻 Local Nitro 12.442s (-1.0%) 13.024s (~) 0.582s 7 1.02x
💻 Local Next.js (Turbopack) 13.750s (+1.0%) 14.025s (~) 0.275s 7 1.13x
🐘 Postgres Next.js (Turbopack) 13.978s (~) 14.445s (+2.0%) 0.467s 7 1.15x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 33.395s (-4.9%) 35.464s (-5.5% 🟢) 2.070s 3 1.00x
▲ Vercel Express 33.415s (-3.8%) 35.564s (-4.1%) 2.149s 3 1.00x
▲ Vercel Nitro 33.444s (-11.8% 🟢) 35.258s (-10.7% 🟢) 1.814s 3 1.00x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.189s (+2.2%) 2.006s (~) 0.817s 15 1.00x
🐘 Postgres Express 1.195s (-0.8%) 2.007s (~) 0.812s 15 1.01x
🐘 Postgres Nitro 1.200s (-1.5%) 2.013s (~) 0.813s 15 1.01x
💻 Local Express 1.232s (+3.4%) 2.006s (~) 0.774s 15 1.04x
🐘 Postgres Next.js (Turbopack) 1.279s (-5.7% 🟢) 2.008s (-3.2%) 0.729s 15 1.08x
💻 Local Next.js (Turbopack) 1.325s (~) 2.007s (~) 0.682s 15 1.11x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.688s (+5.4% 🔺) 4.138s (+1.6%) 1.450s 8 1.00x
▲ Vercel Nitro 2.715s (-12.2% 🟢) 4.322s (-5.8% 🟢) 1.607s 8 1.01x
▲ Vercel Next.js (Turbopack) 2.937s (+25.1% 🔺) 4.375s (+8.9% 🔺) 1.438s 7 1.09x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.325s (-1.2%) 2.224s (-11.3% 🟢) 0.899s 14 1.00x
🐘 Postgres Express 1.350s (-0.6%) 2.316s (-7.7% 🟢) 0.966s 13 1.02x
🐘 Postgres Next.js (Turbopack) 1.701s (+3.9%) 2.470s (-1.6%) 0.769s 13 1.28x
💻 Local Express 1.730s (-8.7% 🟢) 2.006s (-6.8% 🟢) 0.276s 15 1.31x
💻 Local Nitro 1.882s (+15.6% 🔺) 2.150s (+7.2% 🔺) 0.268s 14 1.42x
💻 Local Next.js (Turbopack) 1.896s (+19.0% 🔺) 2.316s (+15.5% 🔺) 0.420s 13 1.43x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.413s (-9.5% 🟢) 5.161s (-4.4%) 1.749s 6 1.00x
▲ Vercel Next.js (Turbopack) 3.485s (-0.6%) 5.536s (+5.4% 🔺) 2.051s 6 1.02x
▲ Vercel Express 3.665s (-10.9% 🟢) 4.961s (-18.1% 🟢) 1.296s 7 1.07x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.572s (-3.1%) 3.897s (~) 2.325s 8 1.00x
🐘 Postgres Nitro 1.776s (+9.3% 🔺) 3.454s (-16.5% 🟢) 1.678s 9 1.13x
🐘 Postgres Next.js (Turbopack) 3.541s (-7.6% 🟢) 4.304s (-3.2%) 0.763s 7 2.25x
💻 Local Express 4.835s (-7.6% 🟢) 5.680s (-2.9%) 0.844s 6 3.08x
💻 Local Next.js (Turbopack) 5.160s (+13.0% 🔺) 6.016s (+16.2% 🔺) 0.856s 5 3.28x
💻 Local Nitro 5.860s (+45.8% 🔺) 6.216s (+35.7% 🔺) 0.356s 5 3.73x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.553s (~) 6.095s (-7.1% 🟢) 1.542s 5 1.00x
▲ Vercel Next.js (Turbopack) 5.030s (+32.8% 🔺) 6.590s (+21.9% 🔺) 1.560s 5 1.10x
▲ Vercel Nitro 5.625s (+32.5% 🔺) 7.522s (+31.3% 🔺) 1.898s 4 1.24x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.187s (-2.9%) 2.008s (~) 0.822s 15 1.00x
🐘 Postgres Express 1.202s (-0.6%) 2.007s (~) 0.805s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.271s (-1.2%) 2.006s (~) 0.735s 15 1.07x
💻 Local Next.js (Turbopack) 1.377s (~) 2.007s (~) 0.630s 15 1.16x
💻 Local Express 1.537s (-4.8%) 2.007s (~) 0.470s 15 1.30x
💻 Local Nitro 1.555s (+2.9%) 2.006s (~) 0.451s 15 1.31x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.580s (+13.4% 🔺) 4.153s (+7.8% 🔺) 1.573s 8 1.00x
▲ Vercel Next.js (Turbopack) 2.733s (+18.5% 🔺) 4.357s (+10.4% 🔺) 1.624s 7 1.06x
▲ Vercel Nitro 2.742s (-57.7% 🟢) 4.165s (-48.1% 🟢) 1.423s 8 1.06x

🔍 Observability: Express | Next.js (Turbopack) | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.251s (-7.8% 🟢) 2.074s (-20.0% 🟢) 0.822s 15 1.00x
🐘 Postgres Express 1.374s (-1.5%) 2.393s (-3.1%) 1.019s 13 1.10x
🐘 Postgres Next.js (Turbopack) 1.525s (-0.7%) 2.222s (~) 0.696s 14 1.22x
💻 Local Nitro 2.027s (+13.3% 🔺) 2.509s (+21.1% 🔺) 0.482s 12 1.62x
💻 Local Next.js (Turbopack) 2.067s (+7.1% 🔺) 2.917s (+31.2% 🔺) 0.850s 11 1.65x
💻 Local Express 2.103s (-18.4% 🟢) 2.591s (-16.6% 🟢) 0.488s 12 1.68x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.917s (-12.4% 🟢) 4.625s (-13.5% 🟢) 1.709s 7 1.00x
▲ Vercel Nitro 3.108s (-17.0% 🟢) 4.682s (-14.2% 🟢) 1.574s 7 1.07x
▲ Vercel Next.js (Turbopack) 3.281s (-18.2% 🟢) 4.655s (-19.0% 🟢) 1.374s 7 1.12x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.530s (-12.8% 🟢) 4.010s (-3.0%) 2.480s 8 1.00x
🐘 Postgres Nitro 1.647s (-4.7%) 3.565s (-8.3% 🟢) 1.918s 9 1.08x
🐘 Postgres Next.js (Turbopack) 3.267s (-14.9% 🟢) 3.888s (-12.5% 🟢) 0.621s 8 2.14x
💻 Local Express 5.422s (-14.5% 🟢) 6.015s (-14.3% 🟢) 0.593s 6 3.55x
💻 Local Nitro 5.742s (+20.6% 🔺) 6.218s (+16.3% 🔺) 0.477s 5 3.75x
💻 Local Next.js (Turbopack) 5.899s (+11.4% 🔺) 6.415s (+6.7% 🔺) 0.516s 5 3.86x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.370s (+9.0% 🔺) 7.919s (+21.9% 🔺) 2.549s 4 1.00x
▲ Vercel Nitro 5.738s (-12.9% 🟢) 7.686s (-7.9% 🟢) 1.948s 4 1.07x
▲ Vercel Express 6.486s (+23.9% 🔺) 8.281s (+18.9% 🔺) 1.795s 4 1.21x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.544s (-15.7% 🟢) 1.026s (-1.5%) 0.482s 59 1.00x
🐘 Postgres Express 0.577s (-2.6%) 1.023s (+1.7%) 0.446s 59 1.06x
💻 Local Nitro 0.606s (+4.0%) 1.005s (~) 0.398s 60 1.12x
💻 Local Express 0.626s (-5.1% 🟢) 1.005s (-3.3%) 0.379s 60 1.15x
🐘 Postgres Next.js (Turbopack) 0.798s (-6.2% 🟢) 1.006s (-1.7%) 0.208s 60 1.47x
💻 Local Next.js (Turbopack) 0.874s (-1.2%) 1.022s (-3.3%) 0.148s 59 1.61x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 7.268s (+10.5% 🔺) 8.674s (+0.5%) 1.406s 7 1.00x
▲ Vercel Next.js (Turbopack) 7.338s (-1.1%) 8.872s (-5.0% 🟢) 1.534s 7 1.01x
▲ Vercel Nitro 8.125s (-4.0%) 9.797s (-3.0%) 1.672s 7 1.12x

🔍 Observability: Express | 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 🥇 Express 1.330s (-7.3% 🟢) 2.008s (-1.1%) 0.677s 45 1.00x
🐘 Postgres Nitro 1.363s (-5.7% 🟢) 2.104s (+4.8%) 0.740s 44 1.02x
💻 Local Nitro 1.487s (+0.6%) 2.006s (~) 0.519s 45 1.12x
💻 Local Express 1.528s (-3.6%) 2.006s (~) 0.479s 45 1.15x
🐘 Postgres Next.js (Turbopack) 1.915s (-6.0% 🟢) 2.123s (-17.2% 🟢) 0.208s 43 1.44x
💻 Local Next.js (Turbopack) 2.105s (-1.0%) 3.008s (~) 0.903s 30 1.58x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 15.020s (-25.4% 🟢) 16.762s (-23.3% 🟢) 1.743s 6 1.00x
▲ Vercel Nitro 15.304s (-18.5% 🟢) 16.989s (-18.2% 🟢) 1.685s 6 1.02x
▲ Vercel Next.js (Turbopack) 16.638s (-16.4% 🟢) 18.493s (-17.4% 🟢) 1.855s 5 1.11x

🔍 Observability: Express | 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 🥇 Express 2.637s (-5.1% 🟢) 3.034s (-3.3%) 0.396s 40 1.00x
🐘 Postgres Nitro 2.844s (+0.8%) 3.377s (+7.6% 🔺) 0.533s 36 1.08x
💻 Local Nitro 3.241s (+2.3%) 3.977s (+1.6%) 0.735s 31 1.23x
💻 Local Express 3.243s (-3.0%) 4.009s (~) 0.766s 30 1.23x
🐘 Postgres Next.js (Turbopack) 3.780s (-6.1% 🟢) 4.009s (-8.9% 🟢) 0.230s 30 1.43x
💻 Local Next.js (Turbopack) 4.436s (-2.3%) 5.011s (-0.8%) 0.575s 24 1.68x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 29.696s (-18.1% 🟢) 31.428s (-17.7% 🟢) 1.731s 4 1.00x
▲ Vercel Express 31.220s (-19.3% 🟢) 32.988s (-18.4% 🟢) 1.768s 4 1.05x
▲ Vercel Next.js (Turbopack) 35.477s (-20.9% 🟢) 37.240s (-20.3% 🟢) 1.763s 4 1.19x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.237s (-9.1% 🟢) 1.006s (~) 0.769s 60 1.00x
🐘 Postgres Nitro 0.265s (+1.5%) 1.009s (~) 0.745s 60 1.12x
🐘 Postgres Next.js (Turbopack) 0.320s (+3.9%) 1.023s (+1.6%) 0.703s 59 1.35x
💻 Local Express 0.431s (+0.6%) 1.022s (+1.7%) 0.591s 59 1.82x
💻 Local Nitro 0.447s (+3.5%) 1.005s (~) 0.558s 60 1.88x
💻 Local Next.js (Turbopack) 0.562s (-13.1% 🟢) 1.040s (-1.8%) 0.478s 58 2.37x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.029s (-29.7% 🟢) 3.757s (-25.3% 🟢) 1.728s 17 1.00x
▲ Vercel Express 2.377s (-33.5% 🟢) 3.857s (-31.0% 🟢) 1.480s 16 1.17x
▲ Vercel Next.js (Turbopack) 2.403s (-21.8% 🟢) 3.870s (-22.8% 🟢) 1.468s 16 1.18x

🔍 Observability: Nitro | 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 🥇 Nitro 0.347s (-24.2% 🟢) 1.008s (-6.5% 🟢) 0.662s 90 1.00x
🐘 Postgres Express 0.393s (-4.3%) 1.017s (+1.1%) 0.624s 89 1.13x
🐘 Postgres Next.js (Turbopack) 0.581s (-14.2% 🟢) 1.146s (-10.2% 🟢) 0.564s 79 1.68x
💻 Local Nitro 2.144s (+6.6% 🔺) 2.638s (+8.1% 🔺) 0.493s 35 6.19x
💻 Local Express 2.176s (-0.7%) 2.686s (-5.8% 🟢) 0.510s 34 6.28x
💻 Local Next.js (Turbopack) 2.433s (-4.9%) 3.115s (-4.5%) 0.682s 29 7.02x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.916s (-43.4% 🟢) 4.314s (-40.3% 🟢) 1.398s 21 1.00x
▲ Vercel Nitro 3.063s (-12.1% 🟢) 4.634s (-10.4% 🟢) 1.571s 20 1.05x
▲ Vercel Next.js (Turbopack) 3.147s (-17.2% 🟢) 4.697s (-18.1% 🟢) 1.550s 20 1.08x

🔍 Observability: Express | 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 🥇 Nitro 0.621s (-26.3% 🟢) 1.061s (-27.9% 🟢) 0.440s 114 1.00x
🐘 Postgres Express 0.773s (-8.8% 🟢) 1.326s (-12.1% 🟢) 0.552s 91 1.25x
🐘 Postgres Next.js (Turbopack) 2.779s (-10.0% 🟢) 3.711s (-3.0%) 0.932s 33 4.47x
💻 Local Nitro 9.592s (+9.9% 🔺) 10.194s (+10.2% 🔺) 0.601s 12 15.45x
💻 Local Express 9.832s (~) 10.277s (~) 0.445s 12 15.83x
💻 Local Next.js (Turbopack) 10.738s (+2.4%) 11.574s (+1.6%) 0.837s 11 17.29x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.937s (-13.1% 🟢) 7.539s (-12.6% 🟢) 1.601s 16 1.00x
▲ Vercel Nitro 6.960s (+3.1%) 8.454s (-2.1%) 1.495s 15 1.17x
▲ Vercel Next.js (Turbopack) 7.409s (+2.9%) 8.875s (-1.0%) 1.466s 15 1.25x

🔍 Observability: Express | 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
🐘 Postgres 🥇 Nitro 1.135s (-5.3% 🟢) 2.002s (~) 0.001s (-33.3% 🟢) 2.009s (~) 0.874s 10 1.00x
🐘 Postgres Express 1.164s (-0.8%) 1.997s (~) 0.001s (-9.1% 🟢) 2.010s (~) 0.845s 10 1.03x
💻 Local Nitro 1.165s (+0.6%) 2.005s (~) 0.012s (+21.8% 🔺) 2.019s (~) 0.855s 10 1.03x
💻 Local Express 1.165s (-0.5%) 2.005s (~) 0.010s (-14.8% 🟢) 2.017s (~) 0.853s 10 1.03x
💻 Local Next.js (Turbopack) 1.214s (-2.8%) 2.004s (~) 0.013s (+18.7% 🔺) 2.021s (~) 0.806s 10 1.07x
🐘 Postgres Next.js (Turbopack) 1.231s (-1.0%) 2.001s (~) 0.001s (+16.7% 🔺) 2.011s (~) 0.780s 10 1.08x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.266s (-4.1%) 3.168s (-10.2% 🟢) 1.002s (+42.4% 🔺) 4.533s (-5.4% 🟢) 2.268s 10 1.00x
▲ Vercel Nitro 2.337s (-8.3% 🟢) 3.515s (-5.3% 🟢) 0.819s (+10.6% 🔺) 4.747s (-4.4%) 2.410s 10 1.03x
▲ Vercel Next.js (Turbopack) 2.337s (-12.9% 🟢) 3.220s (-14.0% 🟢) 1.149s (+37.2% 🔺) 4.801s (-5.6% 🟢) 2.464s 10 1.03x

🔍 Observability: Express | Nitro | 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.567s (-2.3%) 2.001s (~) 0.005s (+5.4% 🔺) 2.027s (~) 0.460s 30 1.00x
💻 Local Express 1.581s (-1.8%) 2.010s (~) 0.013s (+3.2%) 2.025s (~) 0.444s 30 1.01x
💻 Local Nitro 1.587s (+1.3%) 2.011s (~) 0.012s (+5.0%) 2.025s (~) 0.438s 30 1.01x
🐘 Postgres Nitro 1.681s (+2.5%) 2.141s (+6.9% 🔺) 0.004s (-19.8% 🟢) 2.159s (+6.5% 🔺) 0.479s 29 1.07x
💻 Local Next.js (Turbopack) 1.748s (~) 2.009s (~) 0.012s (-8.9% 🟢) 2.024s (~) 0.276s 30 1.12x
🐘 Postgres Next.js (Turbopack) 1.766s (-1.5%) 2.044s (+1.6%) 0.005s (-8.5% 🟢) 2.058s (+1.5%) 0.292s 30 1.13x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.323s (-7.9% 🟢) 7.373s (-14.0% 🟢) 0.262s (-16.5% 🟢) 8.146s (-13.2% 🟢) 1.823s 8 1.00x
▲ Vercel Nitro 6.488s (-3.6%) 7.753s (-3.6%) 0.234s (+6.7% 🔺) 8.433s (-4.3%) 1.945s 8 1.03x
▲ Vercel Express 6.771s (-1.8%) 7.961s (-4.7%) 0.241s (-30.1% 🟢) 8.601s (-6.8% 🟢) 1.830s 7 1.07x

🔍 Observability: Next.js (Turbopack) | Nitro | Express

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.774s (-3.0%) 1.028s (-1.9%) 0.000s (+Infinity% 🔺) 1.051s (-0.8%) 0.278s 58 1.00x
🐘 Postgres Nitro 0.850s (+4.6%) 1.131s (+6.3% 🔺) 0.000s (+7.7% 🔺) 1.161s (+7.5% 🔺) 0.311s 52 1.10x
🐘 Postgres Next.js (Turbopack) 0.989s (-3.8%) 1.487s (-8.3% 🟢) 0.000s (+80.5% 🔺) 1.496s (-8.3% 🟢) 0.507s 41 1.28x
💻 Local Nitro 1.365s (+1.0%) 2.014s (~) 0.000s (+100.0% 🔺) 2.016s (~) 0.651s 30 1.76x
💻 Local Express 1.424s (~) 2.014s (~) 0.000s (+85.7% 🔺) 2.016s (~) 0.593s 30 1.84x
💻 Local Next.js (Turbopack) 1.513s (~) 2.014s (~) 0.001s (+81.8% 🔺) 2.018s (~) 0.505s 30 1.96x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.233s (-12.4% 🟢) 4.395s (-10.3% 🟢) 0.000s (+Infinity% 🔺) 4.822s (-13.2% 🟢) 1.589s 13 1.00x
▲ Vercel Nitro 3.378s (-17.8% 🟢) 4.498s (-21.7% 🟢) 0.000s (NaN%) 4.994s (-20.0% 🟢) 1.616s 13 1.04x
▲ Vercel Next.js (Turbopack) 3.584s (-4.8%) 4.449s (-16.6% 🟢) 0.000s (-90.6% 🟢) 4.923s (-16.3% 🟢) 1.339s 13 1.11x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

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

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.708s (+3.3%) 2.174s (~) 0.000s (NaN%) 2.187s (~) 0.479s 28 1.00x
🐘 Postgres Nitro 1.803s (+6.4% 🔺) 2.475s (+13.8% 🔺) 0.000s (-100.0% 🟢) 2.502s (+14.1% 🔺) 0.699s 25 1.06x
🐘 Postgres Next.js (Turbopack) 2.130s (-5.5% 🟢) 2.697s (-1.2%) 0.000s (NaN%) 2.705s (-1.2%) 0.575s 23 1.25x
💻 Local Nitro 3.065s (-0.5%) 3.839s (-1.6%) 0.001s (+57.1% 🔺) 3.842s (-1.5%) 0.778s 16 1.79x
💻 Local Express 3.066s (-7.6% 🟢) 3.778s (-6.2% 🟢) 0.000s (-56.3% 🟢) 3.781s (-6.3% 🟢) 0.715s 16 1.80x
💻 Local Next.js (Turbopack) 3.199s (+12.8% 🔺) 3.657s (+7.1% 🔺) 0.000s (-5.9% 🟢) 3.677s (+7.5% 🔺) 0.478s 17 1.87x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 4.671s (-5.1% 🟢) 6.137s (~) 0.000s (NaN%) 6.578s (-3.3%) 1.907s 10 1.00x
▲ Vercel Express 4.715s (-22.3% 🟢) 5.711s (-24.8% 🟢) 0.000s (-100.0% 🟢) 6.156s (-24.8% 🟢) 1.440s 10 1.01x
▲ Vercel Next.js (Turbopack) 5.018s (-28.9% 🟢) 6.170s (-25.0% 🟢) 0.000s (-100.0% 🟢) 6.613s (-24.5% 🟢) 1.595s 10 1.07x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 18/21
Next.js (Turbopack) 🐘 Postgres 15/21
Nitro 🐘 Postgres 16/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: Community world (local development)

📋 View full workflow run

@pranaygp pranaygp merged commit b52869e into main Jun 15, 2026
108 of 114 checks passed
@pranaygp pranaygp deleted the pgp/changeset-peer-dependents-out-of-range branch June 15, 2026 22:41
github-actions Bot added a commit that referenced this pull request Jun 15, 2026
…2439)

@workflow/ai declares `workflow` as a peerDependency. By default,
changesets force-bumps a package a full major whenever a peer
dependency takes a minor/major bump, regardless of whether the new
version is still within the declared range
(`onlyUpdatePeerDependentsWhenOutOfRange` defaults to false).

On the `stable` branch (regular changeset mode) this caused three
ordinary `workflow` minors (4.3.0/4.4.0/4.5.0) to drag @workflow/ai
to 5.0.0/6.0.0/7.0.0 with no real changes. Setting the option to
true makes the major bump fire only when a new `workflow` version
actually leaves @workflow/ai's `^4` peer range.

Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Signed-off-by: Pranay Prakash <pranay.gp@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

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

pranaygp added a commit that referenced this pull request Jun 16, 2026
* origin/main:
  Small detail panel cleanup (#2459)
  Fix lazy Next workflow HMR (#2438)
  Prevent peer dependency-only major bumps (#2437)
  fix(changesets): only major-bump peer dependents when out of range (#2439)
  Version Packages (beta) (#2428)
  otel: explicit traceparent injection + linked-trace mode for bounded per-invocation traces (#2363)
  [next] Clarify `serverExternalPackages` warning (#2417)
  Add .swc gitignore handling to builder (#2427)
  Version Packages (beta) (#2390)
  [ci] Increase dev.test.ts cleanup hook timeout (#2416)
  [world-vercel] Switch event endpoints to v4 wire format (#2055)
  docs: document run idempotency (#2011)
  Render attr_set events and run attributes in observability UI (#2393)
  [ci] Fix backport job model slug (#2403)
  [ci] Comment on PR when backport fails, revert to use opus 4.8 (#2400)
  Update queue client to 0.3.1 (#2399)
  fix(deps): upgrade esbuild to 0.28.1 (GHSA-gv7w-rqvm-qjhr) (#2395)
  test: e2e coverage for run-idempotency conflict-handling strategies (#2387)

# Conflicts:
#	pnpm-lock.yaml
pranaygp added a commit that referenced this pull request Jun 16, 2026
* origin/main:
  fix(core): make deploymentId 'latest' a no-op in non-Vercel worlds (#2397)
  fix(deps): upgrade astro to 6.4.6 to resolve CVE-2026-54299 (#2457)
  Small detail panel cleanup (#2459)
  Fix lazy Next workflow HMR (#2438)
  Prevent peer dependency-only major bumps (#2437)
  fix(changesets): only major-bump peer dependents when out of range (#2439)
  Version Packages (beta) (#2428)
  otel: explicit traceparent injection + linked-trace mode for bounded per-invocation traces (#2363)
  [next] Clarify `serverExternalPackages` warning (#2417)
  Add .swc gitignore handling to builder (#2427)
  Version Packages (beta) (#2390)
  [ci] Increase dev.test.ts cleanup hook timeout (#2416)
  [world-vercel] Switch event endpoints to v4 wire format (#2055)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants