Skip to content

ci: migrate workflows to gh-sts for scoped GitHub tokens#2005

Open
TooTallNate wants to merge 4 commits into
mainfrom
ci/use-gh-sts-for-backport
Open

ci: migrate workflows to gh-sts for scoped GitHub tokens#2005
TooTallNate wants to merge 4 commits into
mainfrom
ci/use-gh-sts-for-backport

Conversation

@TooTallNate
Copy link
Copy Markdown
Member

@TooTallNate TooTallNate commented May 15, 2026

Summary

Migrates the four CI workflows that need write access beyond what the default GITHUB_TOKEN now allows to use gh-sts, which mints a scoped GitHub App installation token from the workflow's OIDC identity.

Workflow Reason
backport.yml createCommitOnBranch for the backport branch — GITHUB_TOKEN returns FORBIDDEN under the org's new GHA token policy. Visibly failing.
release.yml changesets/action uses commitMode: github-api (createCommitOnBranch) to update the "Version Packages" PR. Same root cause; will start failing on the next release.
tests.yml Publish E2E Results job pushes JSON to gh-pages. Has been silently failing on every main push since 2026-04-22 (enterprise "require signed commits on ~ALL refs" ruleset rejects unsigned pushes). Swapped peaceiris/actions-gh-pages for an inline createCommitOnBranch call.
benchmarks.yml Same as tests.yml but for Publish Benchmark Results.

Verification

  • backport.yml: re-running the failed PR #1828 backport via workflow_dispatch once the companion infra PR is merged will exercise the new path.
  • release.yml: next "Version Packages" update on main will exercise it.
  • tests.yml / benchmarks.yml: confirmed gh-pages is currently stuck at the 2026-04-22 commit; first push to main after merge will validate.

Copilot AI review requested due to automatic review settings May 15, 2026 18:08
@TooTallNate TooTallNate requested a review from a team as a code owner May 15, 2026 18:08
@vercel
Copy link
Copy Markdown
Contributor

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

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 15, 2026

⚠️ No Changeset found

Latest commit: 1ba1b1d

Merging this PR will not cause a version bump for any packages. If these changes should not result in a new version, you're good to go. If these changes should result in a version bump, you need to add a changeset.

This PR includes no changesets

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

Click here to learn what changesets are, and how to add one.

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 15, 2026

🧪 E2E Test Results

Some tests failed

Summary

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

❌ Failed Tests

▲ Vercel Production (4 failed)

nextjs-turbopack (2 failed):

  • parallelSleepWorkflow | wrun_01KS2MEJ57HDXRY9XFJNP6JC04 | 🔍 observability
  • distributedAbortController - TTL expiration triggers signal | wrun_01KS2N5QNVW42X4123V8CD6MQV | 🔍 observability

nitro (1 failed):

  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KS2MV0ZSFD3XF2YP25X9V6F2 | 🔍 observability

vite (1 failed):

  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KS2MYF3NJ3CJBAMRXCKXAGZR | 🔍 observability

Details by Category

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

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 15, 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.025s (-42.7% 🟢) 1.004s (~) 0.980s 10 1.00x
💻 Local Express 0.031s (-29.6% 🟢) 1.006s (~) 0.975s 10 1.26x
🐘 Postgres Express 0.050s (-13.3% 🟢) 1.012s (~) 0.962s 10 2.04x
🐘 Postgres Nitro 0.051s (-46.6% 🟢) 1.012s (-3.0%) 0.961s 10 2.06x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.318s (+26.5% 🔺) 2.260s (-3.1%) 1.942s 10 1.00x
▲ Vercel Nitro 0.327s (-20.3% 🟢) 2.336s (-6.9% 🟢) 2.010s 10 1.03x
▲ 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 🥇 Nitro 1.061s (-6.2% 🟢) 2.006s (~) 0.944s 10 1.00x
💻 Local Express 1.075s (-4.5%) 2.006s (~) 0.931s 10 1.01x
🐘 Postgres Nitro 1.079s (-5.3% 🟢) 2.009s (~) 0.929s 10 1.02x
🐘 Postgres Express 1.081s (-5.7% 🟢) 2.009s (~) 0.928s 10 1.02x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.633s (-58.0% 🟢) 3.889s (-34.2% 🟢) 2.256s 10 1.00x
▲ Vercel Next.js (Turbopack) 1.691s (-16.9% 🟢) 4.184s (+9.2% 🔺) 2.493s 10 1.04x
▲ 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 🥇 Nitro 10.338s (-5.6% 🟢) 11.020s (~) 0.682s 3 1.00x
🐘 Postgres Express 10.402s (-5.1% 🟢) 11.018s (~) 0.616s 3 1.01x
🐘 Postgres Nitro 10.408s (-4.3%) 11.017s (~) 0.609s 3 1.01x
💻 Local Express 10.426s (-4.5%) 11.023s (~) 0.597s 3 1.01x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 13.626s (-42.6% 🟢) 16.124s (-35.8% 🟢) 2.498s 2 1.00x
▲ Vercel Next.js (Turbopack) 14.851s (-14.2% 🟢) 17.850s (-8.0% 🟢) 2.998s 2 1.09x
▲ 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
💻 Local 🥇 Nitro 13.265s (-11.9% 🟢) 14.026s (-12.5% 🟢) 0.760s 5 1.00x
🐘 Postgres Nitro 13.433s (-8.0% 🟢) 14.017s (-6.7% 🟢) 0.584s 5 1.01x
🐘 Postgres Express 13.451s (-7.8% 🟢) 14.017s (-6.7% 🟢) 0.566s 5 1.01x
💻 Local Express 13.480s (-10.0% 🟢) 14.026s (-6.7% 🟢) 0.547s 5 1.02x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 22.589s (-65.0% 🟢) 25.036s (-62.4% 🟢) 2.447s 3 1.00x
▲ Vercel Next.js (Turbopack) 23.180s (-55.9% 🟢) 25.237s (-53.8% 🟢) 2.057s 3 1.03x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Nitro | Next.js (Turbopack)

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.465s (-31.7% 🟢) 12.021s (-29.4% 🟢) 0.555s 8 1.00x
🐘 Postgres Nitro 11.893s (-14.8% 🟢) 12.139s (-15.2% 🟢) 0.246s 8 1.04x
🐘 Postgres Express 11.908s (-15.0% 🟢) 12.141s (-16.8% 🟢) 0.233s 8 1.04x
💻 Local Express 11.986s (-27.8% 🟢) 12.398s (-27.2% 🟢) 0.412s 8 1.05x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 36.013s (-90.9% 🟢) 38.277s (-90.3% 🟢) 2.265s 3 1.00x
▲ Vercel Nitro 36.579s (-91.4% 🟢) 38.887s (-90.8% 🟢) 2.308s 3 1.02x
▲ 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 🥇 Nitro 1.140s (-10.6% 🟢) 2.008s (~) 0.868s 15 1.00x
💻 Local Nitro 1.140s (-30.1% 🟢) 2.005s (-3.3%) 0.865s 15 1.00x
🐘 Postgres Express 1.168s (-7.4% 🟢) 2.008s (~) 0.840s 15 1.02x
💻 Local Express 1.199s (-19.5% 🟢) 2.006s (~) 0.807s 15 1.05x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.359s (-1.1%) 5.460s (+10.7% 🔺) 2.101s 6 1.00x
▲ Vercel Nitro 5.511s (+95.5% 🔺) 7.623s (+76.4% 🔺) 2.113s 4 1.64x
▲ 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 1.182s (-49.7% 🟢) 2.007s (-33.3% 🟢) 0.825s 15 1.00x
🐘 Postgres Express 1.186s (-49.8% 🟢) 2.007s (-33.3% 🟢) 0.821s 15 1.00x
💻 Local Nitro 1.567s (-50.1% 🟢) 2.005s (-48.4% 🟢) 0.438s 15 1.33x
💻 Local Express 2.065s (-30.1% 🟢) 2.392s (-30.7% 🟢) 0.327s 13 1.75x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.851s (-5.0%) 5.718s (-3.4%) 1.867s 6 1.00x
▲ Vercel Next.js (Turbopack) 4.480s (-36.9% 🟢) 6.339s (-28.8% 🟢) 1.859s 5 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 1.288s (-63.0% 🟢) 2.007s (-49.9% 🟢) 0.719s 15 1.00x
🐘 Postgres Express 1.306s (-62.5% 🟢) 2.008s (-49.9% 🟢) 0.702s 15 1.01x
💻 Local Nitro 4.192s (-49.8% 🟢) 4.868s (-46.0% 🟢) 0.676s 7 3.25x
💻 Local Express 6.113s (-26.7% 🟢) 6.615s (-26.7% 🟢) 0.502s 5 4.74x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.912s (-33.7% 🟢) 7.870s (-28.2% 🟢) 1.958s 4 1.00x
▲ Vercel Nitro 7.728s (+119.2% 🔺) 10.083s (+82.2% 🔺) 2.355s 3 1.31x
▲ 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 🥇 Nitro 1.139s (-9.4% 🟢) 2.008s (~) 0.869s 15 1.00x
🐘 Postgres Express 1.141s (-9.2% 🟢) 2.008s (~) 0.867s 15 1.00x
💻 Local Nitro 1.292s (-30.7% 🟢) 2.005s (-14.3% 🟢) 0.713s 15 1.13x
💻 Local Express 1.443s (-23.8% 🟢) 2.007s (-15.1% 🟢) 0.564s 15 1.27x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.114s (+6.2% 🔺) 5.408s (+16.5% 🔺) 2.294s 6 1.00x
▲ Vercel Nitro 3.203s (+30.2% 🔺) 5.216s (+25.1% 🔺) 2.013s 6 1.03x
▲ 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 1.203s (-48.6% 🟢) 2.009s (-33.3% 🟢) 0.806s 15 1.00x
🐘 Postgres Nitro 1.205s (-48.5% 🟢) 2.008s (-33.3% 🟢) 0.803s 15 1.00x
💻 Local Nitro 1.668s (-45.6% 🟢) 2.072s (-46.7% 🟢) 0.404s 15 1.39x
💻 Local Express 2.262s (-27.8% 🟢) 2.676s (-28.9% 🟢) 0.414s 12 1.88x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 4.669s (+48.6% 🔺) 6.626s (+46.5% 🔺) 1.957s 5 1.00x
▲ Vercel Nitro 5.447s (+68.5% 🔺) 7.589s (+49.5% 🔺) 2.142s 5 1.17x
▲ 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 🥇 Nitro 1.306s (-62.5% 🟢) 2.008s (-49.9% 🟢) 0.702s 15 1.00x
🐘 Postgres Express 1.323s (-62.2% 🟢) 2.008s (-49.9% 🟢) 0.685s 15 1.01x
💻 Local Nitro 4.326s (-52.7% 🟢) 4.866s (-51.5% 🟢) 0.540s 7 3.31x
💻 Local Express 6.092s (-30.8% 🟢) 6.616s (-28.7% 🟢) 0.524s 5 4.67x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.974s (-11.6% 🟢) 7.919s (-7.3% 🟢) 1.944s 4 1.00x
▲ Vercel Nitro 6.619s (+30.0% 🔺) 8.596s (+26.1% 🔺) 1.978s 4 1.11x
▲ 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
💻 Local 🥇 Nitro 0.399s (-59.4% 🟢) 1.003s (-8.3% 🟢) 0.605s 60 1.00x
🐘 Postgres Nitro 0.427s (-47.9% 🟢) 1.006s (~) 0.579s 60 1.07x
🐘 Postgres Express 0.459s (-45.3% 🟢) 1.007s (-1.6%) 0.548s 60 1.15x
💻 Local Express 0.496s (-49.6% 🟢) 1.004s (-6.7% 🟢) 0.509s 60 1.24x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.580s (-61.5% 🟢) 7.252s (-54.9% 🟢) 1.672s 9 1.00x
▲ Vercel Nitro 6.469s (-70.7% 🟢) 8.655s (-64.0% 🟢) 2.185s 7 1.16x
▲ 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
💻 Local 🥇 Nitro 0.996s (-67.2% 🟢) 1.383s (-63.2% 🟢) 0.387s 66 1.00x
🐘 Postgres Nitro 1.059s (-45.0% 🟢) 1.559s (-25.8% 🟢) 0.499s 58 1.06x
🐘 Postgres Express 1.086s (-45.0% 🟢) 1.705s (-24.5% 🟢) 0.618s 53 1.09x
💻 Local Express 1.248s (-58.6% 🟢) 2.006s (-44.0% 🟢) 0.758s 45 1.25x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 14.908s (-70.1% 🟢) 17.322s (-66.5% 🟢) 2.414s 6 1.00x
▲ Vercel Nitro 16.181s (-59.0% 🟢) 18.738s (-54.6% 🟢) 2.557s 5 1.09x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.036s (-50.4% 🟢) 2.477s (-46.2% 🟢) 0.441s 49 1.00x
🐘 Postgres Express 2.044s (-48.8% 🟢) 2.549s (-41.7% 🟢) 0.505s 48 1.00x
💻 Local Nitro 2.461s (-73.5% 🟢) 3.083s (-69.2% 🟢) 0.622s 39 1.21x
💻 Local Express 2.878s (-68.8% 🟢) 3.166s (-68.4% 🟢) 0.289s 38 1.41x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 43.824s (-59.1% 🟢) 45.648s (-58.1% 🟢) 1.824s 3 1.00x
▲ Vercel Nitro 46.444s (-52.1% 🟢) 48.779s (-50.4% 🟢) 2.334s 3 1.06x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.176s (-37.7% 🟢) 1.006s (~) 0.829s 60 1.00x
🐘 Postgres Express 0.177s (-37.3% 🟢) 1.006s (~) 0.829s 60 1.00x
💻 Local Nitro 0.368s (-39.2% 🟢) 1.003s (-1.8%) 0.635s 60 2.08x
💻 Local Express 0.484s (-13.6% 🟢) 1.005s (~) 0.520s 60 2.74x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.387s (+18.0% 🔺) 4.518s (+19.1% 🔺) 2.131s 14 1.00x
▲ Vercel Nitro 2.789s (+67.9% 🔺) 4.728s (+41.1% 🔺) 1.939s 13 1.17x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.284s (-42.8% 🟢) 1.006s (~) 0.722s 90 1.00x
🐘 Postgres Express 0.289s (-43.3% 🟢) 1.006s (~) 0.717s 90 1.02x
💻 Local Nitro 2.031s (-20.0% 🟢) 2.535s (-15.8% 🟢) 0.504s 36 7.15x
💻 Local Express 2.371s (-5.7% 🟢) 2.945s (-2.1%) 0.574s 31 8.35x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 9.666s (+173.4% 🔺) 11.861s (+128.4% 🔺) 2.194s 8 1.00x
▲ Vercel Nitro 9.872s (+206.0% 🔺) 12.120s (+151.4% 🔺) 2.248s 8 1.02x
▲ Vercel Express ⚠️ missing - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.587s (-25.7% 🟢) 1.006s (~) 0.419s 120 1.00x
🐘 Postgres Express 0.598s (-27.0% 🟢) 1.006s (-1.1%) 0.408s 120 1.02x
💻 Local Nitro 8.985s (-19.7% 🟢) 9.639s (-17.4% 🟢) 0.654s 13 15.30x
💻 Local Express 10.537s (-5.8% 🟢) 11.121s (-6.9% 🟢) 0.584s 11 17.95x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 24.411s (+216.1% 🔺) 27.088s (+188.2% 🔺) 2.677s 5 1.00x
▲ Vercel Next.js (Turbopack) 25.521s (+147.1% 🔺) 28.144s (+129.1% 🔺) 2.622s 5 1.05x
▲ 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 🥇 Nitro 1.106s (+417.7% 🔺) 2.003s (+99.5% 🔺) 0.008s (-33.6% 🟢) 2.014s (+97.7% 🔺) 0.907s 10 1.00x
🐘 Postgres Nitro 1.135s (+453.5% 🔺) 1.998s (+99.9% 🔺) 0.001s (-26.7% 🟢) 2.010s (+98.8% 🔺) 0.876s 10 1.03x
💻 Local Express 1.149s (+477.0% 🔺) 2.006s (+99.7% 🔺) 0.013s (+7.4% 🔺) 2.021s (+98.5% 🔺) 0.872s 10 1.04x
🐘 Postgres Express 1.150s (+460.7% 🔺) 2.002s (+100.5% 🔺) 0.001s (-31.3% 🟢) 2.011s (+98.9% 🔺) 0.861s 10 1.04x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.337s (-39.0% 🟢) 3.798s (-28.0% 🟢) 1.860s (+150.7% 🔺) 6.210s (-4.2%) 3.873s 10 1.00x
▲ Vercel Next.js (Turbopack) 2.506s (-63.4% 🟢) 3.985s (-53.9% 🟢) 13.763s (+2078.1% 🔺) 18.295s (+86.9% 🔺) 15.789s 10 1.07x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: 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
💻 Local 🥇 Nitro 1.449s (+72.7% 🔺) 2.010s (+98.6% 🔺) 0.008s (-13.6% 🟢) 2.020s (+81.0% 🔺) 0.571s 30 1.00x
🐘 Postgres Nitro 1.492s (+139.1% 🔺) 2.003s (+99.0% 🔺) 0.004s (-1.7%) 2.025s (+98.1% 🔺) 0.533s 30 1.03x
🐘 Postgres Express 1.507s (+139.3% 🔺) 2.003s (+99.0% 🔺) 0.004s (+3.6%) 2.027s (+98.1% 🔺) 0.519s 30 1.04x
💻 Local Express 1.752s (+131.4% 🔺) 2.013s (+95.6% 🔺) 0.010s (+10.8% 🔺) 2.204s (+112.0% 🔺) 0.453s 28 1.21x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 6.036s (-64.3% 🟢) 7.660s (-58.0% 🟢) 0.399s (+89.1% 🔺) 8.736s (-53.9% 🟢) 2.701s 7 1.00x
▲ Vercel Nitro 6.073s (-79.4% 🟢) 7.732s (-74.9% 🟢) 0.377s (+236.6% 🔺) 8.651s (-72.8% 🟢) 2.578s 7 1.01x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: Next.js (Turbopack) | Nitro

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.632s (-34.8% 🟢) 1.032s (-17.3% 🟢) 0.000s (-58.6% 🟢) 1.043s (-17.1% 🟢) 0.411s 58 1.00x
🐘 Postgres Express 0.666s (-30.7% 🟢) 1.028s (-19.6% 🟢) 0.000s (-20.7% 🟢) 1.045s (-20.0% 🟢) 0.379s 58 1.05x
💻 Local Nitro 1.195s (-2.2%) 1.981s (-1.9%) 0.000s (-35.5% 🟢) 1.983s (-1.9%) 0.787s 31 1.89x
💻 Local Express 1.762s (+43.8% 🔺) 2.016s (~) 0.001s (+73.1% 🔺) 2.404s (+18.9% 🔺) 0.642s 26 2.79x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 3.653s (+19.7% 🔺) 5.169s (+17.7% 🔺) 0.001s (+963.6% 🔺) 5.746s (+19.5% 🔺) 2.093s 11 1.00x
▲ Vercel Next.js (Turbopack) 4.265s (-58.1% 🟢) 5.945s (-48.4% 🟢) 0.000s (+Infinity% 🔺) 6.503s (-46.0% 🟢) 2.238s 10 1.17x
▲ Vercel Express ⚠️ missing - - - - -

🔍 Observability: 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 🥇 Nitro 1.311s (-26.8% 🟢) 2.028s (-5.3% 🟢) 0.000s (+86.7% 🔺) 2.042s (-6.1% 🟢) 0.731s 30 1.00x
🐘 Postgres Express 1.399s (-21.1% 🟢) 2.100s (-3.6%) 0.000s (NaN%) 2.114s (-3.8%) 0.715s 29 1.07x
💻 Local Nitro 2.446s (-27.8% 🟢) 3.075s (-23.7% 🟢) 0.000s (-15.6% 🟢) 3.078s (-23.7% 🟢) 0.632s 20 1.87x
💻 Local Express 3.157s (-9.0% 🟢) 3.966s (-1.7%) 0.000s (-60.9% 🟢) 3.968s (-1.7%) 0.811s 16 2.41x
💻 Local Next.js (Turbopack) ⚠️ missing - - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - - -

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.845s (+4.1%) 7.597s (+8.8% 🔺) 0.001s (+300.0% 🔺) 8.136s (+7.9% 🔺) 2.290s 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 21/21
🐘 Postgres Nitro 18/21
▲ Vercel Next.js (Turbopack) 14/21
Fastest World by Framework

Winner determined by most benchmark wins

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

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

Updates the backport-to-stable GitHub Actions workflow to mint a scoped GitHub App installation token via vercel/gh-sts-action, addressing org policy restrictions that prevent the default GITHUB_TOKEN from calling createCommitOnBranch (needed to produce GitHub-signed commits for protected branches).

Changes:

  • Add id-token: write to allow exchanging the job’s OIDC token for a scoped GitHub App token via gh-sts.
  • Use the gh-sts minted token for the createCommitOnBranch push step and for creating the backport PR, while keeping PR comment steps on the default GITHUB_TOKEN.
Comments suppressed due to low confidence (1)

.github/workflows/backport.yml:624

  • The gh-sts minted token is only used here for createCommitOnBranch (contents write) and gh pr create (pull_requests write). It doesn’t appear to be used for issue comments, so granting "issues":"write" is unnecessary. Consider dropping the issues permission from the gh-sts request to keep the installation token least-privileged.
        with:
          repos: vercel/workflow
          permissions: '{"contents":"write","issues":"write","pull_requests":"write"}'

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

Comment thread .github/workflows/backport.yml Outdated
The default `GITHUB_TOKEN` recently lost the ability to call the
`createCommitOnBranch` GraphQL mutation under our org's GHA token
policy (returns "Resource not accessible by integration" / FORBIDDEN).
That mutation is how we push a GitHub-signed commit to the backport
branch — required by the enterprise "require signed branch commits"
ruleset that targets ~ALL refs with no bypass actors.

Switch to vercel/gh-sts-action to exchange the workflow's OIDC token
for a scoped GitHub App installation token (via the new
`vercel-workflow-backport-to-stable` gh-sts policy). Use that token
for both the createCommitOnBranch push and the PR creation; leave the
comment-on-PR steps on the default GITHUB_TOKEN since posting issue
comments still works with it.

Failing run that motivated this:
  https://github.com/vercel/workflow/actions/runs/25893078275
The default GITHUB_TOKEN in these workflows is only used for read-only
lookups (gh api, gh pr list, actions/checkout) and for posting issue
comments back on the source PR; everything that writes to the repo
goes through the scoped gh-sts token. Trim the job-level permissions
to reflect that:

- backport.yml: contents/pull-requests downgraded from write to read;
  drop unused issues:write from the gh-sts request (we only post
  comments via the default token).
- release.yml: contents downgraded from write to read; drop unused
  pull-requests permission entirely.
- tests.yml + benchmarks.yml (publish-results job): contents
  downgraded from write to read (only used for checkout).
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.

3 participants