Skip to content

Reduce unnecessary CI runtime#2151

Open
pranaygp wants to merge 4 commits into
mainfrom
pranaygp/codex/ci-runtime-fast-paths
Open

Reduce unnecessary CI runtime#2151
pranaygp wants to merge 4 commits into
mainfrom
pranaygp/codex/ci-runtime-fast-paths

Conversation

@pranaygp
Copy link
Copy Markdown
Contributor

@pranaygp pranaygp commented May 28, 2026

Summary

  • require manual dispatch or the explicit community-benchmarks label before community-world benchmark jobs run
  • fast-path docs/UI-only pull requests through the required E2E check while keeping unit coverage for UI package changes and full runtime CI for runtime/workflow changes
  • build Linux E2E package artifacts once and reuse them for stable local E2E lanes; Next.js canary lanes continue to rebuild after dependency changes, and Vercel prod remains independent of the shared build gate

Why

I inspected the last 24 hours of Actions data before making these changes. Community-world benchmark jobs accounted for roughly 6,174 runner-minutes while repeatedly reaching their 60-minute timeout with no successful Redis, MongoDB, or Redis + BullMQ jobs in the sampled period. Local E2E lanes also repeated the same initial package build, totaling roughly 3,839 runner-minutes in ended runs.

This PR intentionally leaves a Vitest upgrade and smaller sleep/timing cleanups out of scope so the workflow behavior and resulting time reduction are easier to validate.

Validation

  • parsed .github/workflows/tests.yml and .github/workflows/benchmarks.yml with Ruby YAML parsing
  • ran git diff --check
  • ran actionlint against the edited workflows and compared against origin-https/main; remaining diagnostics are pre-existing baseline diagnostics
  • ran pnpm turbo run build --filter='!./workbench/*' --output-logs=errors-only successfully (29 scheduled tasks succeeded in about 59 seconds)
  • ran pnpm changeset status --since=origin-https/main for the CI-only empty changeset
  • confirmed the active main ruleset requires DCO and E2E Required Check only; individual skipped E2E lanes are not required checks

CI observation

Monitoring confirmed that stable Linux local E2E lanes restore e2e-package-build-artifacts into packages, Next.js canary lanes continue to rebuild, Vercel-prod lanes start independently of the shared build job, and community-world benchmarks are skipped without the opt-in label. E2E Required Check passed after hosted E2E retries. The Vercel Express and Nitro benchmark lanes continue to expose a pre-existing hosted stream-truncation failure outside this workflow diff.

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 28, 2026

🦋 Changeset detected

Latest commit: 681afae

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

@vercel
Copy link
Copy Markdown
Contributor

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

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 28, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 1250 5 219 1474
✅ 💻 Local Development 1657 0 219 1876
✅ 📦 Local Production 1542 0 200 1742
✅ 🐘 Local Postgres 1657 0 219 1876
✅ 📋 Other 762 0 176 938
Total 6868 5 1033 7906

❌ Failed Tests

▲ Vercel Production (5 failed)

fastify (1 failed):

hono (1 failed):

  • experimental_setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-webpack (1 failed):

  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KSTX068VE03PG4D37GN3ZQN3 | 🔍 observability

nitro (2 failed):

  • webhookWorkflow | wrun_01KSTWHS9PTJS5B0CW6V0XT3M5 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 108 0 26
✅ example 108 0 26
✅ express 108 0 26
❌ fastify 107 1 26
❌ hono 107 1 26
✅ nextjs-turbopack 132 0 2
❌ nextjs-webpack 131 1 2
❌ nitro 106 2 26
✅ nuxt 108 0 26
✅ sveltekit 127 0 7
✅ vite 108 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 109 0 25
✅ e2e-local-dev-tanstack-start- 109 0 25
✅ e2e-local-postgres-nest-stable 109 0 25
✅ e2e-local-postgres-tanstack-start- 109 0 25
✅ e2e-local-prod-nest-stable 109 0 25
✅ e2e-local-prod-tanstack-start- 109 0 25
✅ e2e-vercel-prod-tanstack-start 108 0 26

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 28, 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.040s (-8.4% 🟢) 1.006s (~) 0.966s 10 1.00x
💻 Local Express 0.045s (+1.1%) 1.006s (~) 0.961s 10 1.13x
💻 Local Next.js (Turbopack) 0.053s 1.006s 0.953s 10 1.35x
🐘 Postgres Nitro 0.061s (-35.6% 🟢) 1.021s (-2.1%) 0.960s 10 1.55x
🐘 Postgres Express 0.062s (+6.6% 🔺) 1.013s (~) 0.951s 10 1.56x
🐘 Postgres Next.js (Turbopack) 0.066s 1.011s 0.945s 10 1.66x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 0.372s (+57.9% 🔺) 2.495s (+16.8% 🔺) 2.123s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 1.091s (-3.5%) 2.006s (~) 0.915s 10 1.00x
💻 Local Express 1.094s (-2.7%) 2.006s (~) 0.912s 10 1.00x
🐘 Postgres Nitro 1.103s (-3.2%) 2.015s (~) 0.912s 10 1.01x
💻 Local Next.js (Turbopack) 1.107s 2.007s 0.900s 10 1.01x
🐘 Postgres Express 1.114s (-2.8%) 2.011s (~) 0.896s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.157s 2.009s 0.852s 10 1.06x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 1.718s (-8.4% 🟢) 3.768s (-1.0%) 2.050s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 10.501s (-4.1%) 11.021s (~) 0.520s 3 1.00x
💻 Local Express 10.551s (-3.4%) 11.023s (~) 0.472s 3 1.00x
🐘 Postgres Nitro 10.556s (-2.9%) 11.041s (~) 0.485s 3 1.01x
🐘 Postgres Express 10.595s (-3.4%) 11.019s (~) 0.424s 3 1.01x
💻 Local Next.js (Turbopack) 10.627s 11.022s 0.395s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.933s 11.354s 0.421s 3 1.04x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.364s (-21.3% 🟢) 15.416s (-23.0% 🟢) 2.051s 2 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.714s (-8.4% 🟢) 14.025s (-6.7% 🟢) 0.311s 5 1.00x
💻 Local Nitro 13.765s (-8.6% 🟢) 14.027s (-12.5% 🟢) 0.262s 5 1.00x
🐘 Postgres Nitro 13.797s (-5.5% 🟢) 14.032s (-6.6% 🟢) 0.236s 5 1.01x
🐘 Postgres Express 13.852s (-5.0% 🟢) 14.020s (-6.7% 🟢) 0.168s 5 1.01x
💻 Local Next.js (Turbopack) 13.927s 14.026s 0.099s 5 1.02x
🐘 Postgres Next.js (Turbopack) 14.464s 15.018s 0.554s 4 1.05x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 20.564s (-59.1% 🟢) 22.445s (-57.3% 🟢) 1.881s 3 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 12.328s (-26.5% 🟢) 13.026s (-23.5% 🟢) 0.698s 7 1.00x
💻 Local Express 12.538s (-24.5% 🟢) 13.025s (-23.5% 🟢) 0.487s 7 1.02x
🐘 Postgres Express 12.604s (-10.0% 🟢) 13.024s (-10.8% 🟢) 0.420s 7 1.02x
💻 Local Next.js (Turbopack) 12.825s 13.024s 0.199s 7 1.04x
🐘 Postgres Next.js (Turbopack) 13.852s 14.303s 0.451s 7 1.12x
🐘 Postgres Nitro 14.077s (+0.8%) 14.471s (+1.1%) 0.394s 7 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 34.254s (-71.7% 🟢) 36.548s (-70.4% 🟢) 2.295s 3 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.181s (-6.3% 🟢) 2.007s (~) 0.826s 15 1.00x
💻 Local Express 1.197s (-19.6% 🟢) 2.006s (~) 0.809s 15 1.01x
💻 Local Nitro 1.254s (-23.2% 🟢) 2.006s (-3.3%) 0.752s 15 1.06x
🐘 Postgres Next.js (Turbopack) 1.262s 2.009s 0.747s 15 1.07x
💻 Local Next.js (Turbopack) 1.284s 2.006s 0.721s 15 1.09x
🐘 Postgres Nitro 1.342s (+5.3% 🔺) 2.054s (+2.2%) 0.712s 15 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.530s (-11.6% 🟢) 4.162s (-10.0% 🟢) 1.633s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.243s (-47.4% 🟢) 2.008s (-33.3% 🟢) 0.765s 15 1.00x
🐘 Postgres Nitro 1.305s (-44.5% 🟢) 2.015s (-33.0% 🟢) 0.710s 15 1.05x
🐘 Postgres Next.js (Turbopack) 1.387s 2.007s 0.621s 15 1.12x
💻 Local Nitro 1.757s (-44.1% 🟢) 2.006s (-48.4% 🟢) 0.249s 15 1.41x
💻 Local Express 1.765s (-40.2% 🟢) 2.006s (-41.9% 🟢) 0.242s 15 1.42x
💻 Local Next.js (Turbopack) 1.816s 2.149s 0.333s 14 1.46x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 307.729s (+8402.4% 🔺) 309.681s (+5959.7% 🔺) 1.952s 1 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.358s (-61.0% 🟢) 2.008s (-49.9% 🟢) 0.650s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.680s 2.294s 0.614s 14 1.24x
🐘 Postgres Nitro 1.996s (-42.6% 🟢) 2.921s (-27.1% 🟢) 0.925s 11 1.47x
💻 Local Next.js (Turbopack) 4.362s 5.012s 0.649s 6 3.21x
💻 Local Nitro 4.648s (-44.3% 🟢) 5.178s (-42.6% 🟢) 0.530s 6 3.42x
💻 Local Express 5.359s (-35.7% 🟢) 6.012s (-33.4% 🟢) 0.653s 5 3.95x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.601s (+55.7% 🔺) 8.893s (+45.1% 🔺) 2.292s 4 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.178s (-6.3% 🟢) 2.009s (~) 0.831s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.261s 2.009s 0.748s 15 1.07x
💻 Local Next.js (Turbopack) 1.336s 2.005s 0.670s 15 1.13x
🐘 Postgres Nitro 1.494s (+18.8% 🔺) 2.194s (+9.3% 🔺) 0.700s 14 1.27x
💻 Local Nitro 1.518s (-18.7% 🟢) 2.006s (-14.3% 🟢) 0.489s 15 1.29x
💻 Local Express 1.589s (-16.1% 🟢) 2.073s (-12.3% 🟢) 0.484s 15 1.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.972s (+15.1% 🔺) 5.223s (+20.1% 🔺) 2.251s 6 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.243s (-46.9% 🟢) 2.008s (-33.3% 🟢) 0.765s 15 1.00x
🐘 Postgres Nitro 1.388s (-40.7% 🟢) 2.231s (-25.9% 🟢) 0.843s 14 1.12x
🐘 Postgres Next.js (Turbopack) 1.411s 2.008s 0.596s 15 1.14x
💻 Local Next.js (Turbopack) 1.901s 2.313s 0.412s 13 1.53x
💻 Local Express 2.021s (-35.5% 🟢) 2.509s (-33.3% 🟢) 0.488s 12 1.63x
💻 Local Nitro 2.083s (-32.0% 🟢) 2.469s (-36.5% 🟢) 0.386s 13 1.68x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.908s (+22.4% 🔺) 5.694s (+18.8% 🔺) 1.786s 6 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.369s (-60.9% 🟢) 2.008s (-49.9% 🟢) 0.639s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.736s 2.224s 0.488s 14 1.27x
🐘 Postgres Nitro 1.999s (-42.6% 🟢) 2.859s (-28.7% 🟢) 0.860s 11 1.46x
💻 Local Next.js (Turbopack) 4.646s 5.176s 0.530s 6 3.39x
💻 Local Express 5.510s (-37.4% 🟢) 6.015s (-35.1% 🟢) 0.505s 5 4.03x
💻 Local Nitro 5.721s (-37.4% 🟢) 6.183s (-38.3% 🟢) 0.462s 6 4.18x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.175s (-19.4% 🟢) 6.893s (-15.7% 🟢) 1.718s 5 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Nitro 0.591s (-39.8% 🟢) 1.005s (-8.2% 🟢) 0.414s 60 1.00x
🐘 Postgres Express 0.594s (-29.2% 🟢) 1.007s (-1.6%) 0.413s 60 1.01x
💻 Local Express 0.638s (-35.2% 🟢) 1.039s (-3.4%) 0.402s 58 1.08x
💻 Local Next.js (Turbopack) 0.687s 1.021s 0.334s 59 1.16x
🐘 Postgres Nitro 0.706s (-14.0% 🟢) 1.107s (+10.0% 🔺) 0.401s 55 1.19x
🐘 Postgres Next.js (Turbopack) 0.815s 1.006s 0.191s 60 1.38x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 6.323s (-66.7% 🟢) 8.141s (-61.8% 🟢) 1.817s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 1.395s (-29.4% 🟢) 2.007s (-11.1% 🟢) 0.613s 45 1.00x
💻 Local Nitro 1.494s (-50.8% 🟢) 2.006s (-46.6% 🟢) 0.512s 45 1.07x
💻 Local Express 1.520s (-49.6% 🟢) 2.006s (-44.0% 🟢) 0.486s 45 1.09x
🐘 Postgres Nitro 1.561s (-19.0% 🟢) 2.178s (+3.7%) 0.617s 42 1.12x
💻 Local Next.js (Turbopack) 1.680s 2.028s 0.349s 45 1.20x
🐘 Postgres Next.js (Turbopack) 2.001s 2.536s 0.535s 36 1.44x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.621s (-60.6% 🟢) 15.886s (-56.8% 🟢) 2.265s 6 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.830s (-29.1% 🟢) 3.167s (-27.5% 🟢) 0.336s 38 1.00x
🐘 Postgres Nitro 3.018s (-26.5% 🟢) 3.545s (-23.0% 🟢) 0.527s 34 1.07x
💻 Local Express 3.185s (-65.4% 🟢) 4.009s (-60.0% 🟢) 0.824s 30 1.13x
💻 Local Nitro 3.256s (-65.0% 🟢) 4.042s (-59.7% 🟢) 0.786s 30 1.15x
💻 Local Next.js (Turbopack) 3.516s 4.009s 0.492s 30 1.24x
🐘 Postgres Next.js (Turbopack) 3.820s 4.044s 0.224s 30 1.35x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 30.171s (-76.8% 🟢) 32.855s (-75.1% 🟢) 2.684s 4 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.220s (-22.0% 🟢) 1.007s (~) 0.786s 60 1.00x
🐘 Postgres Nitro 0.230s (-18.8% 🟢) 1.015s (+0.8%) 0.785s 60 1.05x
🐘 Postgres Next.js (Turbopack) 0.286s 1.007s 0.721s 60 1.30x
💻 Local Express 0.431s (-23.2% 🟢) 1.004s (~) 0.574s 60 1.96x
💻 Local Nitro 0.462s (-23.6% 🟢) 1.005s (-1.6%) 0.543s 60 2.10x
💻 Local Next.js (Turbopack) 0.610s 1.095s 0.486s 55 2.77x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.746s (+40.5% 🔺) 4.537s (+24.7% 🔺) 1.791s 14 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.343s (-32.7% 🟢) 1.006s (~) 0.663s 90 1.00x
🐘 Postgres Nitro 0.491s (-1.2%) 1.037s (+3.1%) 0.547s 87 1.43x
🐘 Postgres Next.js (Turbopack) 0.497s 1.007s 0.510s 90 1.45x
💻 Local Express 2.114s (-15.9% 🟢) 2.655s (-11.8% 🟢) 0.542s 34 6.16x
💻 Local Nitro 2.232s (-12.1% 🟢) 2.823s (-6.2% 🟢) 0.591s 32 6.50x
💻 Local Next.js (Turbopack) 2.256s 2.852s 0.596s 32 6.57x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.407s (+77.5% 🔺) 7.198s (+49.7% 🔺) 1.791s 13 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.637s (-22.2% 🟢) 1.006s (-1.1%) 0.369s 120 1.00x
🐘 Postgres Nitro 0.768s (-2.8%) 1.194s (+18.5% 🔺) 0.426s 101 1.21x
🐘 Postgres Next.js (Turbopack) 0.979s 1.608s 0.629s 75 1.54x
💻 Local Express 9.619s (-14.0% 🟢) 10.109s (-15.3% 🟢) 0.490s 12 15.10x
💻 Local Nitro 10.046s (-10.2% 🟢) 10.528s (-9.7% 🟢) 0.482s 12 15.77x
💻 Local Next.js (Turbopack) 10.109s 10.938s 0.829s 11 15.87x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 13.365s (+80.1% 🔺) 15.182s (+64.2% 🔺) 1.817s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -
▲ Vercel Nitro ⚠️ missing - - - -

🔍 Observability: Express

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.159s (+481.9% 🔺) 2.005s (+99.6% 🔺) 0.013s (+4.1%) 2.020s (+98.4% 🔺) 0.861s 10 1.00x
🐘 Postgres Express 1.165s (+468.1% 🔺) 2.001s (+100.4% 🔺) 0.001s (-25.0% 🟢) 2.010s (+98.7% 🔺) 0.845s 10 1.01x
💻 Local Next.js (Turbopack) 1.166s 2.003s 0.010s 2.017s 0.851s 10 1.01x
💻 Local Nitro 1.167s (+445.9% 🔺) 2.005s (+99.6% 🔺) 0.011s (-14.4% 🟢) 2.018s (+98.1% 🔺) 0.851s 10 1.01x
🐘 Postgres Next.js (Turbopack) 1.256s 2.002s 0.001s 2.011s 0.755s 10 1.08x
🐘 Postgres Nitro 1.431s (+598.2% 🔺) 1.999s (+100.0% 🔺) 0.006s (+286.7% 🔺) 2.097s (+107.3% 🔺) 0.665s 10 1.24x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.510s (~) 3.640s (-11.0% 🟢) 1.963s (+104.3% 🔺) 6.073s (+8.6% 🔺) 3.563s 10 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.573s (+107.7% 🔺) 2.010s (+95.3% 🔺) 0.010s (+9.1% 🔺) 2.022s (+94.4% 🔺) 0.449s 30 1.00x
💻 Local Nitro 1.594s (+90.0% 🔺) 2.010s (+98.6% 🔺) 0.009s (-1.8%) 2.021s (+81.1% 🔺) 0.428s 30 1.01x
🐘 Postgres Express 1.635s (+159.6% 🔺) 2.006s (+99.3% 🔺) 0.004s (-3.4%) 2.024s (+97.9% 🔺) 0.389s 30 1.04x
🐘 Postgres Next.js (Turbopack) 1.747s 2.010s 0.004s 2.025s 0.278s 30 1.11x
💻 Local Next.js (Turbopack) 1.805s 2.007s 0.010s 2.200s 0.395s 28 1.15x
🐘 Postgres Nitro 2.040s (+226.9% 🔺) 2.404s (+138.8% 🔺) 0.003s (-25.5% 🟢) 2.438s (+138.4% 🔺) 0.397s 25 1.30x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.862s (-9.9% 🟢) 7.126s (-11.0% 🟢) 0.295s (-27.7% 🟢) 7.899s (-10.6% 🟢) 2.037s 8 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 0.706s (-26.5% 🟢) 1.017s (-20.4% 🟢) 0.000s (+16.9% 🔺) 1.033s (-20.9% 🟢) 0.327s 59 1.00x
🐘 Postgres Next.js (Turbopack) 0.863s 1.133s 0.000s 1.141s 0.278s 53 1.22x
💻 Local Nitro 1.381s (+13.0% 🔺) 2.013s (~) 0.000s (+366.7% 🔺) 2.015s (~) 0.634s 30 1.96x
💻 Local Next.js (Turbopack) 1.431s 2.011s 0.000s 2.014s 0.583s 30 2.03x
💻 Local Express 1.478s (+20.7% 🔺) 2.014s (~) 0.001s (+80.0% 🔺) 2.016s (~) 0.538s 30 2.09x
🐘 Postgres Nitro 1.509s (+55.8% 🔺) 2.028s (+62.5% 🔺) 0.000s (+140.0% 🔺) 2.057s (+63.5% 🔺) 0.548s 30 2.14x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 3.798s (+1.5%) 5.158s (+1.1%) 0.000s (-100.0% 🟢) 5.614s (+1.5%) 1.816s 11 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

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.553s (-12.4% 🟢) 2.179s (~) 0.000s (+Infinity% 🔺) 2.192s (~) 0.640s 28 1.00x
🐘 Postgres Next.js (Turbopack) 1.646s 2.145s 0.000s 2.186s 0.540s 28 1.06x
💻 Local Next.js (Turbopack) 2.912s 3.610s 0.001s 3.617s 0.705s 17 1.88x
🐘 Postgres Nitro 3.286s (+83.4% 🔺) 3.875s (+81.0% 🔺) 0.000s (-100.0% 🟢) 3.919s (+80.2% 🔺) 0.633s 16 2.12x
💻 Local Express 3.328s (-4.0%) 3.893s (-3.5%) 0.001s (-6.3% 🟢) 3.908s (-3.2%) 0.580s 16 2.14x
💻 Local Nitro 3.401s (~) 3.827s (-5.1% 🟢) 0.001s (+87.5% 🔺) 4.165s (+3.2%) 0.764s 15 2.19x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 5.394s (+17.6% 🔺) 6.951s (+15.4% 🔺) 0.001s (+Infinity% 🔺) 7.451s (+15.4% 🔺) 2.057s 9 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -
▲ Vercel Nitro ⚠️ missing - - - - -

🔍 Observability: Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 14/21
Next.js (Turbopack) 🐘 Postgres 12/21
Nitro 💻 Local 11/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.

@pranaygp pranaygp force-pushed the pranaygp/codex/ci-runtime-fast-paths branch from d162d1d to 71b6435 Compare May 29, 2026 01:53
@pranaygp pranaygp marked this pull request as ready for review May 29, 2026 01:54
@pranaygp pranaygp requested a review from a team as a code owner May 29, 2026 01:54
Copilot AI review requested due to automatic review settings May 29, 2026 01:54
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

This PR reduces GitHub Actions CI runtime by introducing a “fast-path” for docs/UI-only pull requests, gating expensive benchmark lanes behind explicit opt-in, and deduplicating repeated E2E package builds by sharing build artifacts across E2E jobs.

Changes:

  • Add a ci-scope job to classify PR changes and skip most CI/benchmarks when only docs/UI files changed.
  • Require manual dispatch or an explicit community-benchmarks label before running community-world benchmark jobs.
  • Build E2E package artifacts once (Linux) and reuse them across local E2E lanes; canary lanes still rebuild.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated 6 comments.

File Description
packages/utils/src/get-port.test.ts Relaxes a Windows timing assertion to reduce CI flakiness.
.github/workflows/tests.yml Adds CI scoping + shared E2E package build artifacts and updates job gating/required-check behavior accordingly.
.github/workflows/benchmarks.yml Adds CI scoping + opt-in gating for community-world benchmarks and skips ordinary benchmarks on fast-path PRs.
.changeset/ci-runtime-fast-paths.md Records the CI behavior change via a changeset entry.

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

Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/tests.yml
Copy link
Copy Markdown
Contributor

@karthikscale3 karthikscale3 left a comment

Choose a reason for hiding this comment

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

ai review: regression/coverage pass on the CI-runtime changes. The artifact sharing and benchmark opt-in look sound; main concern is the fast-path classification removing all test/type coverage for packages/web*. Notes inline (a couple marked optional).

Comment thread .github/workflows/tests.yml Outdated
Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/tests.yml
Comment thread .github/workflows/benchmarks.yml
Copy link
Copy Markdown
Member

@TooTallNate TooTallNate left a comment

Choose a reason for hiding this comment

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

Comment-only — directionally good, one valid concern from @karthikscale3 worth resolving

The CI bill numbers in the PR body are eye-opening (~6.2k runner-minutes on community benchmarks that never finish, ~3.8k on duplicated package builds). The three changes are well-targeted:

  1. Community benchmarks opt-in via community-benchmarks label or manual dispatch — correct, given the 60-minute timeouts with zero success in the 24h sample
  2. Fast-path classification for docs/UI-only PRs
  3. Shared E2E package build artifact with stable lanes downloading once and canary lanes rebuilding

Verified locally / against CI

  • pnpm --filter @workflow/utils test ✓ (94/94 — the Windows timeout bump from 2s → 5s holds)
  • CI: 108 success, 0 failures, 8 skipped on the latest run, with all 65 E2E lanes (Local Dev/Prod/Postgres + Vercel + Windows) + Unit + Build Shared E2E all green. The shared-artifact extraction empirically works.
  • Branch protection: I checked the active rulesets — only DCO and E2E Required Check are required status checks on main. So karthik's branch-protection concern doesn't apply to this repo's config (the meta-check correctly fast-paths and that's the only required status check). Worth keeping that invariant in mind if branch protection ever changes to require individual lanes.
  • Copilot's earlier artifact-nesting concern was empirically resolved by b81601b35 Fix shared E2E artifact extraction path — the green E2E lanes confirm extraction works correctly.

Karthik's "unit job skipped for web/web-shared changes" concern is valid

@karthikscale3 flagged that packages/web/ and packages/web-shared/ in the fast-path patterns means the unit job (which runs pnpm test --filter='!./docs' --filter='!./workbench/vitest') is skipped for those PRs. But @workflow/web-shared has unit tests that the unit job covers — for example, the trace viewer tests, event-list duration tests, etc. With the fast-path, those tests silently don't run for any PR that only touches web-shared.

Two options:

  1. Remove packages/web/ and packages/web-shared/ from the fast-path patterns so the unit job continues to run for those changes. Loses some perf for UI PRs but keeps coverage. This is probably the right call — the original perf win is dominated by E2E lanes, not unit.

  2. Keep them but bump web-shared tests into the fast-path category somehow (e.g. a smaller web-unit job that only runs the web/web-shared package tests). More plumbing, more value preserved.

I'd lean (1) — the unit job is cheap relative to E2E, and silently skipping it for any PR is a real coverage gap.

Karthik's "hand-maintained allowlist drifting from turbo.json" — agreed, low priority

The artifact upload paths (packages/*/dist, packages/*/.well-known, packages/*/src/version.ts, swc-plugin-workflow.wasm, etc.) duplicate turbo.json's build.outputs. If a future package adds a new output dir (e.g. lib/), the artifact won't include it and the lane will silently rebuild. Worth a comment pointing at turbo.json as the source of truth, but probably not worth dynamically deriving the patterns now.

Karthik's "duplicated ci-scope across tests.yml and benchmarks.yml" — agreed, optional

The ci-scope job is byte-identical in both workflow files. If the fastPathPatterns list drifts between them, behavior diverges. Could be extracted to a reusable composite action (.github/actions/detect-ci-scope/). Optional cleanup.

Commenting (not approving) until the web-shared unit coverage gap is resolved

Once you either drop packages/web/ and packages/web-shared/ from the fast-path patterns OR add a targeted unit job that runs for them, I'm happy to approve. The other concerns are non-blocking.

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.

4 participants