Skip to content

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

Open
TooTallNate wants to merge 3 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 3 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 15, 2026 9:24pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 15, 2026 9:24pm
example-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-astro-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-express-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-fastify-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-hono-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-nitro-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workbench-vite-workflow Ready Ready Preview, Comment May 15, 2026 9:24pm
workflow-docs Ready Ready Preview, Comment, Open in v0 May 15, 2026 9:24pm
workflow-swc-playground Ready Ready Preview, Comment May 15, 2026 9:24pm
workflow-tarballs Ready Ready Preview, Comment May 15, 2026 9:24pm
workflow-web Ready Ready Preview, Comment May 15, 2026 9:24pm

@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 1198 2 219 1419
✅ 💻 Local Development 1587 0 219 1806
✅ 📦 Local Production 1587 0 219 1806
❌ 🐘 Local Postgres 1585 2 219 1806
✅ 🪟 Windows 129 0 0 129
❌ 📋 Other 726 1 176 903
Total 6812 5 1052 7869

❌ Failed Tests

▲ Vercel Production (2 failed)

nextjs-webpack (2 failed):

  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KRPRP62W2JS0SY0TY18QK712 | 🔍 observability
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
🐘 Local Postgres (2 failed)

nextjs-turbopack-stable-lazy-discovery-disabled (1 failed):

  • addTenWorkflow | wrun_01KRPRA6HJZ8Z4B054VWGXKPMQ

sveltekit-stable (1 failed):

  • fibonacciWorkflow - recursive workflow composition via start() | wrun_01KRPRPP6P7H70HAC6D73AWZFN
📋 Other (1 failed)

e2e-vercel-prod-tanstack-start (1 failed):

  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KRPRR3DA06K6MF62188SND8Y

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 127 0 2
❌ nextjs-webpack 125 2 2
✅ nitro 103 0 26
✅ nuxt 103 0 26
✅ sveltekit 122 0 7
✅ vite 103 0 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 128 1 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 122 1 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 102 1 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
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 🥇 Express 0.032s (-27.3% 🟢) 1.006s (~) 0.974s 10 1.00x
💻 Local Nitro 0.033s (-23.4% 🟢) 1.006s (~) 0.973s 10 1.02x
🐘 Postgres Nitro 0.048s (-49.2% 🟢) 1.013s (-2.9%) 0.965s 10 1.50x
🐘 Postgres Express 0.049s (-15.0% 🟢) 1.012s (~) 0.962s 10 1.53x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.254s (+8.0% 🔺) 2.724s (+27.5% 🔺) 2.470s 10 1.00x
▲ Vercel Nitro 0.307s (-25.1% 🟢) 2.049s (-18.3% 🟢) 1.742s 10 1.21x
▲ Vercel Next.js (Turbopack) 0.335s (+33.4% 🔺) 2.385s (+2.2%) 2.049s 10 1.32x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.068s (-5.1% 🟢) 2.007s (~) 0.939s 10 1.00x
💻 Local Nitro 1.069s (-5.5% 🟢) 2.006s (~) 0.937s 10 1.00x
🐘 Postgres Express 1.081s (-5.7% 🟢) 2.008s (~) 0.927s 10 1.01x
🐘 Postgres Nitro 1.083s (-5.0% 🟢) 2.010s (~) 0.927s 10 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 🥇 Express 1.574s (-16.1% 🟢) 3.677s (-3.4%) 2.103s 10 1.00x
▲ Vercel Nitro 1.612s (-58.6% 🟢) 3.403s (-42.4% 🟢) 1.790s 10 1.02x
▲ Vercel Next.js (Turbopack) 2.104s (+3.4%) 4.199s (+9.6% 🔺) 2.096s 10 1.34x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.412s (-4.9%) 11.021s (~) 0.609s 3 1.00x
💻 Local Express 10.414s (-4.7%) 11.021s (~) 0.608s 3 1.00x
🐘 Postgres Nitro 10.428s (-4.1%) 11.019s (~) 0.591s 3 1.00x
🐘 Postgres Express 10.447s (-4.7%) 11.014s (~) 0.566s 3 1.00x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.947s (-17.9% 🟢) 16.132s (-19.4% 🟢) 2.184s 2 1.00x
▲ Vercel Nitro 14.011s (-41.0% 🟢) 15.955s (-36.5% 🟢) 1.944s 2 1.00x
▲ Vercel Next.js (Turbopack) 14.204s (-18.0% 🟢) 16.621s (-14.3% 🟢) 2.417s 2 1.02x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 13.433s (-10.8% 🟢) 14.027s (-12.5% 🟢) 0.594s 5 1.00x
🐘 Postgres Express 13.453s (-7.7% 🟢) 14.016s (-6.7% 🟢) 0.563s 5 1.00x
💻 Local Express 13.496s (-9.9% 🟢) 14.028s (-6.7% 🟢) 0.533s 5 1.00x
🐘 Postgres Nitro 13.506s (-7.5% 🟢) 14.021s (-6.7% 🟢) 0.515s 5 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 21.543s (-66.6% 🟢) 23.655s (-64.5% 🟢) 2.112s 3 1.00x
▲ Vercel Next.js (Turbopack) 21.587s (-58.9% 🟢) 23.490s (-57.0% 🟢) 1.904s 3 1.00x
▲ Vercel Express 22.203s (-55.9% 🟢) 24.193s (-54.0% 🟢) 1.990s 3 1.03x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 11.849s (-29.4% 🟢) 12.148s (-28.7% 🟢) 0.299s 8 1.00x
🐘 Postgres Express 11.948s (-14.7% 🟢) 12.514s (-14.2% 🟢) 0.566s 8 1.01x
💻 Local Express 11.950s (-28.0% 🟢) 12.398s (-27.2% 🟢) 0.448s 8 1.01x
🐘 Postgres Nitro 12.160s (-12.9% 🟢) 12.877s (-10.0% 🟢) 0.717s 7 1.03x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 31.866s (-92.5% 🟢) 34.054s (-92.0% 🟢) 2.188s 3 1.00x
▲ Vercel Express 32.223s (-73.4% 🟢) 34.456s (-72.1% 🟢) 2.233s 3 1.01x
▲ Vercel Next.js (Turbopack) 34.145s (-91.3% 🟢) 36.441s (-90.8% 🟢) 2.296s 3 1.07x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.142s (-9.4% 🟢) 2.007s (~) 0.865s 15 1.00x
🐘 Postgres Nitro 1.146s (-10.1% 🟢) 2.007s (~) 0.862s 15 1.00x
💻 Local Nitro 1.172s (-28.2% 🟢) 2.006s (-3.3%) 0.834s 15 1.03x
💻 Local Express 1.181s (-20.6% 🟢) 2.006s (~) 0.825s 15 1.03x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.639s (-6.4% 🟢) 4.144s (-4.1%) 1.505s 8 1.00x
▲ Vercel Express 2.734s (-4.4%) 4.353s (-5.8% 🟢) 1.619s 7 1.04x
▲ Vercel Next.js (Turbopack) 3.010s (-11.4% 🟢) 4.508s (-8.6% 🟢) 1.498s 7 1.14x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.200s (-49.2% 🟢) 2.007s (-33.3% 🟢) 0.806s 15 1.00x
🐘 Postgres Nitro 1.217s (-48.2% 🟢) 2.007s (-33.3% 🟢) 0.789s 15 1.01x
💻 Local Nitro 1.723s (-45.2% 🟢) 2.073s (-46.6% 🟢) 0.349s 15 1.44x
💻 Local Express 1.927s (-34.7% 🟢) 2.293s (-33.6% 🟢) 0.367s 14 1.61x
💻 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.470s (-14.4% 🟢) 4.738s (-20.0% 🟢) 1.268s 7 1.00x
▲ Vercel Express 3.652s (+0.9%) 5.166s (+1.1%) 1.514s 6 1.05x
▲ Vercel Next.js (Turbopack) 4.225s (-40.5% 🟢) 5.943s (-33.3% 🟢) 1.717s 6 1.22x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.312s (-62.3% 🟢) 2.008s (-49.9% 🟢) 0.696s 15 1.00x
🐘 Postgres Express 1.317s (-62.2% 🟢) 2.008s (-49.9% 🟢) 0.691s 15 1.00x
💻 Local Nitro 4.818s (-42.3% 🟢) 5.346s (-40.7% 🟢) 0.528s 6 3.67x
💻 Local Express 5.457s (-34.6% 🟢) 6.014s (-33.4% 🟢) 0.557s 5 4.16x
💻 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.743s (-35.6% 🟢) 7.665s (-30.1% 🟢) 1.923s 4 1.00x
▲ Vercel Nitro 6.177s (+75.2% 🔺) 7.744s (+39.9% 🔺) 1.567s 4 1.08x
▲ Vercel Express 6.631s (+56.4% 🔺) 8.436s (+37.7% 🔺) 1.804s 4 1.15x

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

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.147s (-8.8% 🟢) 2.008s (~) 0.861s 15 1.00x
🐘 Postgres Nitro 1.156s (-8.1% 🟢) 2.010s (~) 0.854s 15 1.01x
💻 Local Express 1.391s (-26.6% 🟢) 2.006s (-15.1% 🟢) 0.616s 15 1.21x
💻 Local Nitro 1.393s (-25.3% 🟢) 2.006s (-14.3% 🟢) 0.613s 15 1.21x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.681s (+9.0% 🔺) 4.496s (+7.8% 🔺) 1.815s 7 1.00x
▲ Vercel Express 2.765s (+7.1% 🔺) 4.508s (+3.6%) 1.742s 7 1.03x
▲ Vercel Next.js (Turbopack) 2.770s (-5.5% 🟢) 4.497s (-3.1%) 1.728s 7 1.03x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.199s (-48.8% 🟢) 2.008s (-33.3% 🟢) 0.809s 15 1.00x
🐘 Postgres Nitro 1.215s (-48.0% 🟢) 2.008s (-33.3% 🟢) 0.793s 15 1.01x
💻 Local Nitro 1.920s (-37.3% 🟢) 2.315s (-40.4% 🟢) 0.395s 13 1.60x
💻 Local Express 2.086s (-33.4% 🟢) 2.591s (-31.1% 🟢) 0.505s 12 1.74x
💻 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.687s (+14.0% 🔺) 5.262s (+3.6%) 1.575s 6 1.00x
▲ Vercel Express 3.965s (+24.2% 🔺) 5.556s (+15.9% 🔺) 1.591s 6 1.08x
▲ Vercel Next.js (Turbopack) 5.211s (+65.8% 🔺) 6.974s (+54.2% 🔺) 1.763s 5 1.41x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.311s (-62.5% 🟢) 2.007s (-50.0% 🟢) 0.696s 15 1.00x
🐘 Postgres Nitro 1.320s (-62.1% 🟢) 2.008s (-49.9% 🟢) 0.688s 15 1.01x
💻 Local Nitro 5.637s (-38.4% 🟢) 6.212s (-38.0% 🟢) 0.575s 5 4.30x
💻 Local Express 6.546s (-25.6% 🟢) 6.818s (-26.5% 🟢) 0.273s 5 4.99x
💻 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.342s (-20.9% 🟢) 6.789s (-20.5% 🟢) 1.447s 5 1.00x
▲ Vercel Nitro 6.518s (+28.0% 🔺) 8.494s (+24.6% 🔺) 1.976s 4 1.22x
▲ Vercel Express 6.639s (+3.5%) 8.620s (+5.4% 🔺) 1.981s 4 1.24x

🔍 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.451s (-45.0% 🟢) 1.007s (~) 0.555s 60 1.00x
🐘 Postgres Express 0.464s (-44.7% 🟢) 1.006s (-1.7%) 0.542s 60 1.03x
💻 Local Express 0.469s (-52.3% 🟢) 1.004s (-6.7% 🟢) 0.535s 60 1.04x
💻 Local Nitro 0.495s (-49.6% 🟢) 1.004s (-8.2% 🟢) 0.509s 60 1.10x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.494s (-71.1% 🟢) 7.369s (-65.5% 🟢) 1.875s 9 1.00x
▲ Vercel Next.js (Turbopack) 5.614s (-61.3% 🟢) 7.611s (-52.7% 🟢) 1.997s 8 1.02x
▲ Vercel Nitro 5.637s (-74.4% 🟢) 7.074s (-70.6% 🟢) 1.438s 9 1.03x

🔍 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.068s (-46.0% 🟢) 1.772s (-21.5% 🟢) 0.703s 51 1.00x
🐘 Postgres Nitro 1.087s (-43.6% 🟢) 1.882s (-10.4% 🟢) 0.796s 48 1.02x
💻 Local Nitro 1.170s (-61.4% 🟢) 2.006s (-46.6% 🟢) 0.835s 45 1.10x
💻 Local Express 1.209s (-59.9% 🟢) 2.006s (-44.0% 🟢) 0.797s 45 1.13x
💻 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.303s (-66.3% 🟢) 15.007s (-63.7% 🟢) 1.704s 6 1.00x
▲ Vercel Express 13.507s (-60.9% 🟢) 15.616s (-57.6% 🟢) 2.109s 6 1.02x
▲ Vercel Next.js (Turbopack) 13.909s (-72.1% 🟢) 15.889s (-69.3% 🟢) 1.980s 6 1.05x

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

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.048s (-48.7% 🟢) 2.528s (-42.1% 🟢) 0.480s 48 1.00x
🐘 Postgres Nitro 2.206s (-46.2% 🟢) 2.781s (-39.6% 🟢) 0.574s 44 1.08x
💻 Local Nitro 2.679s (-71.2% 🟢) 3.032s (-69.7% 🟢) 0.353s 40 1.31x
💻 Local Express 2.725s (-70.4% 🟢) 3.032s (-69.7% 🟢) 0.307s 40 1.33x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 39.138s (-59.6% 🟢) 41.135s (-58.2% 🟢) 1.997s 3 1.00x
▲ Vercel Express 40.859s (-68.6% 🟢) 42.793s (-67.6% 🟢) 1.934s 3 1.04x
▲ Vercel Next.js (Turbopack) 41.565s (-61.2% 🟢) 43.336s (-60.2% 🟢) 1.771s 3 1.06x

🔍 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.176s (-37.6% 🟢) 1.006s (~) 0.829s 60 1.00x
🐘 Postgres Nitro 0.215s (-24.2% 🟢) 1.023s (+1.5%) 0.808s 59 1.22x
💻 Local Nitro 0.415s (-31.4% 🟢) 1.004s (-1.7%) 0.589s 60 2.35x
💻 Local Express 0.437s (-22.0% 🟢) 1.004s (~) 0.567s 60 2.48x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.253s (+15.3% 🔺) 3.829s (+5.3% 🔺) 1.576s 16 1.00x
▲ Vercel Nitro 2.294s (+38.1% 🔺) 3.794s (+13.2% 🔺) 1.501s 17 1.02x
▲ Vercel Next.js (Turbopack) 2.516s (+24.4% 🔺) 4.524s (+19.3% 🔺) 2.009s 14 1.12x

🔍 Observability: Express | 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 🥇 Express 0.290s (-43.1% 🟢) 1.006s (~) 0.716s 90 1.00x
🐘 Postgres Nitro 0.300s (-39.6% 🟢) 1.006s (~) 0.707s 90 1.03x
💻 Local Nitro 2.168s (-14.6% 🟢) 2.852s (-5.2% 🟢) 0.684s 32 7.48x
💻 Local Express 2.224s (-11.5% 🟢) 2.976s (-1.1%) 0.753s 31 7.67x
💻 Local Next.js (Turbopack) ⚠️ missing - - - -
🐘 Postgres Next.js (Turbopack) ⚠️ missing - - - -

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 7.864s (+158.1% 🔺) 9.634s (+100.4% 🔺) 1.770s 10 1.00x
▲ Vercel Next.js (Turbopack) 8.614s (+143.7% 🔺) 10.522s (+102.6% 🔺) 1.908s 9 1.10x
▲ Vercel Nitro 8.689s (+169.4% 🔺) 10.350s (+114.6% 🔺) 1.661s 10 1.10x

🔍 Observability: Express | 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 🥇 Express 0.590s (-28.0% 🟢) 1.006s (-1.1%) 0.416s 120 1.00x
🐘 Postgres Nitro 0.626s (-20.8% 🟢) 1.006s (~) 0.380s 120 1.06x
💻 Local Nitro 9.592s (-14.3% 🟢) 10.362s (-11.2% 🟢) 0.770s 12 16.27x
💻 Local Express 10.099s (-9.8% 🟢) 10.613s (-11.1% 🟢) 0.514s 12 17.13x
💻 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) 22.972s (+122.4% 🔺) 25.069s (+104.0% 🔺) 2.097s 5 1.00x
▲ Vercel Express 23.250s (+213.3% 🔺) 25.284s (+173.5% 🔺) 2.034s 5 1.01x
▲ Vercel Nitro 27.936s (+261.7% 🔺) 29.579s (+214.7% 🔺) 1.643s 5 1.22x

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

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.133s (+469.0% 🔺) 2.005s (+99.6% 🔺) 0.013s (+5.8% 🔺) 2.020s (+98.4% 🔺) 0.887s 10 1.00x
💻 Local Nitro 1.135s (+431.1% 🔺) 2.005s (+99.6% 🔺) 0.010s (-20.8% 🟢) 2.017s (+98.0% 🔺) 0.882s 10 1.00x
🐘 Postgres Express 1.138s (+454.7% 🔺) 2.000s (+100.3% 🔺) 0.002s (+12.5% 🔺) 2.012s (+98.9% 🔺) 0.874s 10 1.00x
🐘 Postgres Nitro 1.138s (+455.3% 🔺) 2.002s (+100.3% 🔺) 0.001s (-6.7% 🟢) 2.010s (+98.7% 🔺) 0.871s 10 1.00x
💻 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) 2.262s (-67.0% 🟢) 3.318s (-61.6% 🟢) 1.811s (+186.6% 🔺) 5.621s (-42.6% 🟢) 3.358s 10 1.00x
▲ Vercel Express 2.274s (-9.2% 🟢) 3.745s (-8.5% 🟢) 2.479s (+158.0% 🔺) 6.711s (+20.0% 🔺) 4.437s 10 1.01x
▲ Vercel Nitro 2.954s (-22.9% 🟢) 3.963s (-24.9% 🟢) 2.063s (+178.1% 🔺) 6.576s (+1.4%) 3.621s 10 1.31x

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

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.494s (+137.1% 🔺) 2.005s (+99.2% 🔺) 0.004s (+3.6%) 2.025s (+98.0% 🔺) 0.531s 30 1.00x
💻 Local Nitro 1.516s (+80.7% 🔺) 2.011s (+98.7% 🔺) 0.010s (+4.9%) 2.023s (+81.3% 🔺) 0.507s 30 1.01x
🐘 Postgres Nitro 1.530s (+145.2% 🔺) 2.003s (+98.9% 🔺) 0.004s (-8.9% 🟢) 2.024s (+98.0% 🔺) 0.494s 30 1.02x
💻 Local Express 1.705s (+125.2% 🔺) 2.012s (+95.6% 🔺) 0.009s (-2.9%) 2.202s (+111.8% 🔺) 0.497s 28 1.14x
💻 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 6.081s (-79.3% 🟢) 6.990s (-77.3% 🟢) 0.658s (+487.8% 🔺) 8.169s (-74.3% 🟢) 2.088s 8 1.00x
▲ Vercel Express 6.190s (-4.8%) 7.524s (-6.1% 🟢) 0.371s (-9.2% 🟢) 8.401s (-4.9%) 2.211s 8 1.02x
▲ Vercel Next.js (Turbopack) 6.431s (-62.0% 🟢) 7.686s (-57.9% 🟢) 0.377s (+78.3% 🔺) 8.562s (-54.8% 🟢) 2.131s 8 1.06x

🔍 Observability: Nitro | Express | 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.662s (-31.1% 🟢) 1.024s (-19.9% 🟢) 0.000s (-20.7% 🟢) 1.045s (-20.0% 🟢) 0.384s 58 1.00x
🐘 Postgres Nitro 0.668s (-31.0% 🟢) 1.045s (-16.3% 🟢) 0.000s (-17.2% 🟢) 1.065s (-15.4% 🟢) 0.396s 58 1.01x
💻 Local Express 1.352s (+10.4% 🔺) 2.014s (~) 0.000s (-40.0% 🟢) 2.016s (~) 0.664s 30 2.04x
💻 Local Nitro 1.359s (+11.1% 🔺) 2.015s (~) 0.000s (+33.3% 🔺) 2.017s (~) 0.658s 30 2.05x
💻 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 🥇 Express 3.888s (+3.9%) 5.063s (-0.8%) 0.002s (+750.0% 🔺) 5.562s (+0.6%) 1.674s 11 1.00x
▲ Vercel Nitro 3.981s (+30.5% 🔺) 5.232s (+19.1% 🔺) 0.000s (+254.5% 🔺) 5.657s (+17.6% 🔺) 1.676s 11 1.02x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Express | Nitro

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.305s (-27.2% 🟢) 2.033s (-5.1% 🟢) 0.000s (-6.7% 🟢) 2.051s (-5.7% 🟢) 0.745s 30 1.00x
🐘 Postgres Express 1.313s (-25.9% 🟢) 1.995s (-8.4% 🟢) 0.000s (NaN%) 2.018s (-8.2% 🟢) 0.705s 30 1.01x
💻 Local Express 3.119s (-10.1% 🟢) 3.840s (-4.8%) 0.000s (-68.8% 🟢) 3.844s (-4.8%) 0.725s 16 2.39x
💻 Local Nitro 3.156s (-6.8% 🟢) 3.968s (-1.6%) 0.000s (-41.4% 🟢) 3.971s (-1.6%) 0.815s 16 2.42x
💻 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 🥇 Express 6.392s (+39.3% 🔺) 7.760s (+28.9% 🔺) 0.000s (+Infinity% 🔺) 8.228s (+27.4% 🔺) 1.836s 8 1.00x
▲ Vercel Nitro 6.414s (+56.7% 🔺) 7.976s (+48.4% 🔺) 0.000s (-100.0% 🟢) 8.476s (+46.3% 🔺) 2.062s 8 1.00x
▲ Vercel Next.js (Turbopack) 6.618s (+17.8% 🔺) 8.422s (+20.6% 🔺) 0.000s (+14.3% 🔺) 8.903s (+18.1% 🔺) 2.284s 7 1.04x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

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

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.

2 participants