Skip to content

[CI Mirror] [world-vercel] Fix HTTP stream append retries after 429 (#4828) - #4832

Closed
alangenfeld wants to merge 1 commit into
mainfrom
alangenfeld/mirror/pr-4828-ci
Closed

alangenfeld wants to merge 1 commit into
mainfrom
alangenfeld/mirror/pr-4828-ci

Conversation

@alangenfeld

Copy link
Copy Markdown
Collaborator

Summary

Internal mirror of #4828 to run CI for an external contributor branch. Fork PRs don't receive repo secrets or OIDC, so the Vercel E2E, benchmark and tarball lanes can't run there.

Notes

…r 429

Squashed, tree-identical copy of 4c29ab6
(mmarufov/workflow:mmarufov/pasted-text-verification) for CI only.
Do not merge.

Signed-off-by: Muhammadjon Marufov <marufov254@gmail.com>
Signed-off-by: Alex Langenfeld <alangenfeld@users.noreply.github.com>
@changeset-bot

changeset-bot Bot commented Oct 12, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 9c2dd9c

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

This PR includes changesets to release 17 packages
Name Type
@workflow/world-vercel Patch
@workflow/cli Patch
@workflow/core Patch
@workflow/web Patch
workflow Patch
@workflow/world-testing Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
@workflow/nuxt Patch

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

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

@vercel

vercel Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated
example-nextjs-workflow-turbopack Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
example-nextjs-workflow-webpack Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
example-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-astro-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-express-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-fastify-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-hono-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-nestjs-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-nitro-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-nuxt-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-python-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-sveltekit-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-tanstack-start-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workbench-vite-workflow Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workflow-docs Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workflow-swc-playground Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workflow-tarballs Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC
workflow-web Ready Ready Preview, v0 Oct 12, 2026 2:30am UTC

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

❌ Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (1 failed)

nest-node (1 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M4PZ4XC50GTYSWZCN5HCS979 | 🔍 observability

vercel-http-transport (1 failed)

express (1 failed):

  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41M4PZAHY60GXNE8CEZFM9QD8G

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

124 flaky tests
  • cross-file step error preserves message and function names in stack (astro · vercel-prod / vercel / node / production) — flaked in 3 jobs
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running (astro · vercel-prod / vercel / node / production) — flaked in 3 jobs
  • hookWithSleepFinalStepWorkflow - step only on final payload (express · vercel-http-transport / vercel / node / http) — flaked in 3 jobs
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication (nitro · vercel-prod / vercel / node / production) — flaked in 3 jobs
  • a chain of takeovers: each victim ends with HookForceClaimedError, deliveries follow the current owner (example · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • abortAfterCompletionWorkflow: abort after step completes is a no-op (hono · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort() (express · vercel-http-transport / vercel / node / http) — flaked in 2 jobs
  • AllInOneService.processNumber - static workflow method using sibling static step methods (nest · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • ChainableService.processWithThis - static step methods using this to reference the class (fastify · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nuxt · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • cross-file step error preserves message and function names in stack (express · vercel-http-transport / vercel / node / http) — flaked in 2 jobs
  • distributedAbortController - manual abort triggers signal (express · vercel-http-transport / vercel / node / http) — flaked in 2 jobs
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary (example · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running (nitro · vercel-http-transport / vercel / node / http) — flaked in 2 jobs
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (fastify · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (astro · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (express · vercel-prod / vercel / quickjs / production) — flaked in 2 jobs
  • instanceMethodStepWorkflow - instance methods with "use step" directive (example · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • resilient start: addTenWorkflow completes when run_created returns 500 (astro · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step (nitro · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument (astro · vercel-prod / vercel / node / production) — flaked in 2 jobs
  • thisSerializationWorkflow - step function invoked with .call() and .apply() (nuxt · vercel-prod / vercel / quickjs / production) — flaked in 2 jobs
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution (vite · vercel-prod / vercel / quickjs / production)
  • a chain of takeovers: each victim ends with HookForceClaimedError, deliveries follow the current owner (express · vercel-prod / vercel / quickjs / production)
  • a forced create on an unowned token is an ordinary hook (hono · vercel-prod / vercel / node / production)
  • a forced create on an unowned token is an ordinary hook (vite · vercel-ws-transport / vercel / node / ws)
  • a run can take over its own earlier hook (fastify · vercel-prod / vercel / node / production)
  • abortAfterCompletionWorkflow: abort after step completes is a no-op (vite · vercel-ws-transport / vercel / node / ws)
  • abortAlreadyAbortedWorkflow: pre-aborted signal seen by step (astro · vercel-prod / vercel / node / production)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (vite · vercel-ws-transport / vercel / node / ws)
  • abortExternalSignalWorkflow: signal passed as workflow input (example · vercel-prod / vercel / node / production)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (nuxt · vercel-prod / vercel / node / production)
  • abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook (express · vercel-http-transport / vercel / node / http)
  • abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort() (nuxt · vercel-prod / vercel / node / production)
  • abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook (example · vercel-prod / vercel / node / production)
  • abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort() (express · vercel-http-transport / vercel / node / http)
  • abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort() (astro · vercel-prod / vercel / node / production)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (tanstack-start · vercel-prod / vercel / node / production)
  • abortParallelWorkflow: abort cancels all parallel steps (example · vercel-prod / vercel / node / production)
  • abortReasonTypesWorkflow: various abort reason types propagate correctly (nest · vercel-prod / vercel / node / production)
  • abortReasonWorkflow: abort reason preserved across boundaries (express · vercel-http-transport / vercel / node / http)
  • abortReasonWorkflow: abort reason preserved across boundaries (nest · vercel-prod / vercel / node / production)
  • abortReasonWorkflow: abort reason preserved across boundaries (express · vercel-ws-transport / vercel / node / ws)
  • abortSurvivesReplayWorkflow: controller state consistent across replay (nitro · vercel-prod / vercel / node / production)
  • abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires (nuxt · vercel-prod / vercel / node / production)
  • abortTimeoutWorkflow: timeout cancels long-running step (astro · vercel-prod / vercel / node / production)
  • abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works (astro · vercel-prod / vercel / node / production)
  • basic step error preserves message and stack trace (fastify · vercel-prod / vercel / node / production)
  • basic step error preserves message and stack trace (nuxt · vercel-prod / vercel / quickjs / production)
  • basic step error preserves message and stack trace (vite · vercel-ws-transport / vercel / node / ws)
  • cancelRun via CLI - cancelling a running workflow (fastify · vercel-prod / vercel / node / production)
  • ChainableService.processWithThis - static step methods using this to reference the class (vite · vercel-prod / vercel / quickjs / production)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express · vercel-ws-transport / vercel / node / ws)
  • cross-file imports preserve message and stack trace (astro · vercel-prod / vercel / node / production)
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context (vite · vercel-http-transport / vercel / node / http)
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context (vite · vercel-prod / vercel / quickjs / production)
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE (vite · vercel-ws-transport / vercel / node / ws)
  • declines to take a token from a run whose runtime predates involuntary disposal: the claimer gets an ordinary HookConflictError (nitro · vercel-http-transport / vercel / node / http)
  • distributedAbortController - reconnect to existing controller (express · vercel-http-transport / vercel / node / http)
  • distributedAbortController - TTL expiration triggers signal (example · vercel-prod / vercel / node / production)
  • experimental_retention: 0 purges the run payloads once the run finishes (express · vercel-ws-transport / vercel / node / ws)
  • FatalError fails immediately without retries (express · vercel-http-transport / vercel / node / http)
  • fibonacciWorkflow - recursive workflow composition via start() (tanstack-start · vercel-prod / vercel / node / production)
  • fire-and-forget: void setAttributes lands without awaiting (vite · vercel-prod / vercel / quickjs / production)
  • getterStepWorkflow - getter functions with "use step" directive (fastify · vercel-prod / vercel / node / production)
  • getterStepWorkflow - getter functions with "use step" directive (vite · vercel-ws-transport / vercel / node / ws)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nitro · vercel-prod / vercel / node / production)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (astro · vercel-prod / vercel / node / production)
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps (vite · vercel-http-transport / vercel / node / http)
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload (example · vercel-prod / vercel / node / production)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (nuxt · vercel-prod / vercel / node / production)
  • hookRaceLoopAfterLostRacesWorkflow - payload reaches the pending await after several lost races, and the next await gets the next payload (nuxt · vercel-prod / vercel / quickjs / production)
  • hookRaceOncePromiseWorkflow - a hook promise raced again receives a payload recorded during a step between the races (express · vercel-http-transport / vercel / node / http)
  • hookRaceOncePromiseWorkflow - a hook promise raced again receives a payload recorded during a step between the races (vite · vercel-ws-transport / vercel / node / ws)
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token (express · vercel-http-transport / vercel / node / http)
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token (tanstack-start · vercel-prod / vercel / node / production)
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token (vite · vercel-prod / vercel / quickjs / production)
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() (hono · vercel-prod / vercel / node / production)
  • hookWithSleepFinalStepWorkflow - step only on final payload (nest · vercel-prod / vercel / node / production)
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep (nuxt · vercel-prod / vercel / node / production)
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep (vite · vercel-prod / vercel / quickjs / production)
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep (express · vercel-ws-transport / vercel / node / ws)
  • importMetaUrlWorkflow - import.meta.url is available in step bundles (express · vercel-prod / vercel / quickjs / production)
  • importMetaUrlWorkflow - import.meta.url is available in step bundles (express · vercel-ws-transport / vercel / node / ws)
  • instanceMethodStepWorkflow - instance methods with "use step" directive (vite · vercel-prod / vercel / quickjs / production)
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) (vite · vercel-http-transport / vercel / node / http)
  • no startIndex (reads all chunks) (express · vercel-ws-transport / vercel / node / ws)
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race (vite · vercel-http-transport / vercel / node / http)
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly (vite · vercel-http-transport / vercel / node / http)
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly (express · vercel-prod / vercel / quickjs / production)
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly (tanstack-start · vercel-prod / vercel / node / production)
  • payloads delivered before the takeover stay with the victim; the iterator then throws (nextjs-webpack · local-dev / local / node / stable)
  • payloads delivered before the takeover stay with the victim; the iterator then throws (astro · vercel-prod / vercel / node / production)
  • payloads delivered before the takeover stay with the victim; the iterator then throws (express · vercel-prod / vercel / quickjs / production)
  • resilient start: addTenWorkflow completes when run_created returns 500 (vite · vercel-http-transport / vercel / node / http)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (express · vercel-prod / vercel / quickjs / production)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro · vercel-prod / vercel / node / production)
  • resumes in flight during the takeover are never lost: each lands in exactly one log (nextjs-webpack · local-dev / local / node / stable)
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries (tanstack-start · vercel-prod / vercel / node / production)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (express · vercel-http-transport / vercel / node / http)
  • setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly (express · vercel-http-transport / vercel / node / http)
  • setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly (fastify · vercel-prod / vercel / node / production)
  • sleepingWorkflow (vite · vercel-http-transport / vercel / node / http)
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) (express · vercel-http-transport / vercel / node / http)
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step (vite · vercel-prod / vercel / quickjs / production)
  • start: initial attributes are seeded on run creation (express · vercel-http-transport / vercel / node / http)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (express · vercel-http-transport / vercel / node / http)
  • step throw of a non-Error value preserves it as cause on the wrapping FatalError (vite · vercel-http-transport / vercel / node / http)
  • step throw of a non-Error value preserves it as cause on the wrapping FatalError (nuxt · vercel-prod / vercel / quickjs / production)
  • step throw round-trips FatalError with cause chain to workflow catch (example · vercel-prod / vercel / node / production)
  • step-argument serialization failure is catchable in workflow code (nuxt · vercel-prod / vercel / quickjs / production)
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument (express · vercel-http-transport / vercel / node / http)
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) (nitro · vercel-http-transport / vercel / node / http)
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) (fastify · vercel-prod / vercel / node / production)
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) (vite · vercel-prod / vercel / quickjs / production)
  • StepNotRegisteredError fails the step but workflow can catch it (nitro · vercel-http-transport / vercel / node / http)
  • StepNotRegisteredError fails the step but workflow can catch it (astro · vercel-prod / vercel / node / production)
  • stepWinsRaceWorkflow (vite · vercel-ws-transport / vercel / node / ws)
  • takes a retained token from a finished run without touching its log (nitro · vercel-http-transport / vercel / node / http)
  • takes the token over: the victim is woken and rejects with HookForceClaimedError, resumes reach the claimer (express · vercel-ws-transport / vercel / node / ws)
  • uncaught step-return-value serialization failure fails the run as USER_ERROR (example · vercel-prod / vercel / node / production)
  • workflow throw of a non-Error value round-trips verbatim as cause (nuxt · vercel-prod / vercel / quickjs / production)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (nitro · vercel-http-transport / vercel / node / http)
  • WorkflowNotRegisteredError fails the run when workflow does not exist (vite · vercel-prod / vercel / quickjs / production)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

  • run-pickup-stall · runs app-generated source against a registered step (tanstack-start) · at 02:31:44Z · abandoned wrun_01M4PZ6TQWYDQ91B2WEBFC0A6C
  • cold-start-warmup · suite warmup (tanstack-start) · at 02:31:46Z · abandoned wrun_01M4PZ6TR1D3GBK4JJS8NQX8V9
  • run-pickup-stall · hookCleanupTestWorkflow - hook token reuse after workflow completion (nextjs-webpack) · at 02:40:28Z · abandoned wrun_01M4PZPT6PYEA0BBHPF4AJVFSH

E2E Test Summary

Summary
Passed Failed Skipped Total
❌ ▲ Vercel Production 3981 1 878 4860
✅ 💻 Local Development 4669 0 551 5220
✅ 📦 Local Production 4669 0 551 5220
✅ 🐘 Local Postgres 4669 0 551 5220
✅ 🪟 Windows 348 0 12 360
✅ 🌐 Cross-language Conformance 68 0 87 155
✅ dynamic-runs 0 0 0 0
❌ vercel-http-transport 896 1 183 1080
✅ vercel-multi-region 27 0 0 27
✅ vercel-ws-transport 607 0 113 720
Total 19934 2 2926 22862
Details by Category

❌ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 145 0 35
✅ astro-quickjs 145 0 35
✅ example-node 145 0 35
✅ example-quickjs 145 0 35
✅ express-node 145 0 35
✅ express-quickjs 145 0 35
✅ fastify-node 145 0 35
✅ fastify-quickjs 145 0 35
✅ hono-node 145 0 35
✅ hono-quickjs 145 0 35
❌ nest-node 144 1 35
✅ nest-quickjs 145 0 35
✅ nextjs-turbopack-node 172 0 8
✅ nextjs-turbopack-quickjs 172 0 8
✅ nextjs-webpack-node 172 0 8
✅ nextjs-webpack-quickjs 172 0 8
✅ nitro-node 145 0 35
✅ nitro-quickjs 145 0 35
✅ nuxt-node 145 0 35
✅ nuxt-quickjs 145 0 35
✅ python-node 66 0 114
✅ sveltekit-node 164 0 16
✅ sveltekit-quickjs 164 0 16
✅ tanstack-start-node 145 0 35
✅ tanstack-start-quickjs 145 0 35
✅ vite-node 145 0 35
✅ vite-quickjs 145 0 35

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable-node 151 0 29
✅ astro-stable-quickjs 151 0 29
✅ express-stable-node 151 0 29
✅ express-stable-quickjs 151 0 29
✅ fastify-stable-node 151 0 29
✅ fastify-stable-quickjs 151 0 29
✅ hono-stable-node 151 0 29
✅ hono-stable-quickjs 151 0 29
✅ nest-stable-node 151 0 29
✅ nest-stable-quickjs 151 0 29
✅ nextjs-turbopack-canary-node 179 0 1
✅ nextjs-turbopack-canary-quickjs 179 0 1
✅ nextjs-turbopack-quickjs-snapshot 179 0 1
✅ nextjs-turbopack-stable-node 179 0 1
✅ nextjs-turbopack-stable-quickjs 179 0 1
✅ nextjs-webpack-canary-node 179 0 1
✅ nextjs-webpack-canary-quickjs 179 0 1
✅ nextjs-webpack-stable-node 179 0 1
✅ nextjs-webpack-stable-quickjs 179 0 1
✅ nitro-stable-node 151 0 29
✅ nitro-stable-quickjs 151 0 29
✅ nuxt-stable-node 151 0 29
✅ nuxt-stable-quickjs 151 0 29
✅ sveltekit-stable-node 170 0 10
✅ sveltekit-stable-quickjs 170 0 10
✅ tanstack-start-node 151 0 29
✅ tanstack-start-quickjs 151 0 29
✅ vite-stable-node 151 0 29
✅ vite-stable-quickjs 151 0 29

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 151 0 29
✅ astro-stable-quickjs 151 0 29
✅ express-stable-node 151 0 29
✅ express-stable-quickjs 151 0 29
✅ fastify-stable-node 151 0 29
✅ fastify-stable-quickjs 151 0 29
✅ hono-stable-node 151 0 29
✅ hono-stable-quickjs 151 0 29
✅ nest-stable-node 151 0 29
✅ nest-stable-quickjs 151 0 29
✅ nextjs-turbopack-canary-node 179 0 1
✅ nextjs-turbopack-canary-quickjs 179 0 1
✅ nextjs-turbopack-quickjs-snapshot 179 0 1
✅ nextjs-turbopack-stable-node 179 0 1
✅ nextjs-turbopack-stable-quickjs 179 0 1
✅ nextjs-webpack-canary-node 179 0 1
✅ nextjs-webpack-canary-quickjs 179 0 1
✅ nextjs-webpack-stable-node 179 0 1
✅ nextjs-webpack-stable-quickjs 179 0 1
✅ nitro-stable-node 151 0 29
✅ nitro-stable-quickjs 151 0 29
✅ nuxt-stable-node 151 0 29
✅ nuxt-stable-quickjs 151 0 29
✅ sveltekit-stable-node 170 0 10
✅ sveltekit-stable-quickjs 170 0 10
✅ tanstack-start-node 151 0 29
✅ tanstack-start-quickjs 151 0 29
✅ vite-stable-node 151 0 29
✅ vite-stable-quickjs 151 0 29

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 151 0 29
✅ astro-stable-quickjs 151 0 29
✅ express-stable-node 151 0 29
✅ express-stable-quickjs 151 0 29
✅ fastify-stable-node 151 0 29
✅ fastify-stable-quickjs 151 0 29
✅ hono-stable-node 151 0 29
✅ hono-stable-quickjs 151 0 29
✅ nest-stable-node 151 0 29
✅ nest-stable-quickjs 151 0 29
✅ nextjs-turbopack-canary-node 179 0 1
✅ nextjs-turbopack-canary-quickjs 179 0 1
✅ nextjs-turbopack-quickjs-snapshot 179 0 1
✅ nextjs-turbopack-stable-node 179 0 1
✅ nextjs-turbopack-stable-quickjs 179 0 1
✅ nextjs-webpack-canary-node 179 0 1
✅ nextjs-webpack-canary-quickjs 179 0 1
✅ nextjs-webpack-stable-node 179 0 1
✅ nextjs-webpack-stable-quickjs 179 0 1
✅ nitro-stable-node 151 0 29
✅ nitro-stable-quickjs 151 0 29
✅ nuxt-stable-node 151 0 29
✅ nuxt-stable-quickjs 151 0 29
✅ sveltekit-stable-node 170 0 10
✅ sveltekit-stable-quickjs 170 0 10
✅ tanstack-start-node 151 0 29
✅ tanstack-start-quickjs 151 0 29
✅ vite-stable-node 151 0 29
✅ vite-stable-quickjs 151 0 29

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 174 0 6
✅ nextjs-turbopack-quickjs 174 0 6

✅ 🌐 Cross-language Conformance

App Passed Failed Skipped
✅ python 68 0 87

✅ dynamic-runs

App Passed Failed Skipped
✅ astro-vercel 0 0 0
✅ example-vercel 0 0 0
✅ express-vercel 0 0 0
✅ fastify-vercel 0 0 0
✅ hono-vercel 0 0 0
✅ nest-vercel 0 0 0
✅ nextjs-turbopack-vercel 0 0 0
✅ nextjs-webpack-vercel 0 0 0
✅ nitro-vercel 0 0 0
✅ nuxt-vercel 0 0 0
✅ sveltekit-vercel 0 0 0
✅ tanstack-start-vercel 0 0 0
✅ vite-vercel 0 0 0

❌ vercel-http-transport

App Passed Failed Skipped
✅ example 145 0 35
❌ express 144 1 35
✅ hono 145 0 35
✅ nextjs-turbopack 172 0 8
✅ nitro 145 0 35
✅ vite 145 0 35

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

✅ vercel-ws-transport

App Passed Failed Skipped
✅ example 145 0 35
✅ express 145 0 35
✅ nextjs-turbopack 172 0 8
✅ vite 145 0 35

📋 View full workflow run

@github-actions

github-actions Bot commented Oct 12, 2026 •

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 9c2dd9c · Mon, 12 Oct 2026 02:39:24 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 1782 (+502%) 🔻 1907 🔴 (+26%) 🔻 1947 🔴 (+18%) 🔻 2135 🔴 (+1.5%) 30
TTFS stream 1817 (+527%) 🔻 1892 🔴 (+31%) 🔻 1916 🔴 (+27%) 🔻 1995 🔴 (+23%) 🔻 30
TTFS hook + stream 2003 (+25%) 🔻 2265 🔴 (+32%) 🔻 2308 🔴 (+32%) 🔻 5249 🔴 (+137%) 🔻 30
Fan-out TTFS Promise.all(100 steps) 501 (+3.5%) 749 (-18%) 💚 751 (-21%) 💚 2310 (+34%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 1382 (-61%) 💚 2804 (-34%) 💚 3575 (-16%) 💚 7809 (+80%) 🔻 10
STSO 1020 steps (inline) 94 (+11%) 112 (-2.6%) 130 (-9.1%) 158 (-51%) 💚 1019
WO 1020 steps 113340 (-2.3%) 113340 (-2.3%) 113340 (-2.3%) 113340 (-2.3%) 1
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 115748ms → this run 113099ms (Δ -2649ms, -2%)

 50-100 ms  ┃█████████                main 393  this  30  -363
100-150 ms  ██████████████░░░░░░░░░┃  main 556  this 974  +418
150-200 ms  ┃                         main  48  this  13   -35
200-250 ms  ┃                         main   4  this   1    -3
250-300 ms  ┃                         main   5  this   0    -5
300-350 ms  ┃                         main   5  this   1    -4
350-400 ms  ┃                         main   2  this   0    -2
400-450 ms  ┃                         main   1  this   0    -1
450-500 ms  ┃                         main   1  this   0    -1
500-550 ms  ┃                         main   3  this   0    -3
550-600 ms  ┃                         main   1  this   0    -1
ℹ️ Metric definitions & methodology

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). █ = main, ┃ = this run, ░ = fill.

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies. Streaming delivery performance is measured in durabench.

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟢 world-sim scenario book — 0 fail of 42 total

fence=per-spec

scenario outcome events virt replay violations
✅ smoke-no-steps completed 3 0ms ok 0
✅ smoke-one-step completed 6 0ms ok 0
✅ hook-at-step-started completed 12 0ms ok 0
✅ hook-at-step-completed completed 12 0ms ok 0
✅ hook-at-hook-created completed 12 0ms ok 0
✅ deadline-hook-wins completed 7 1.0h ok 0
✅ deadline-expires completed 7 1.0h ok 0
✅ step-vs-timer-early-settlement completed 8 1.0h ok 0
✅ long-sleep completed 11 30.0d ok 0
✅ hook-never-arrives stalled 3 0ms skipped 0
✅ step-retries-twice completed 10 2.0s ok 0
✅ parallel-steps completed 9 0ms ok 0
✅ hook-on-execution-state completed 12 0ms ok 0
✅ peek-hook-before-branch completed 12 0ms ok 0
✅ peek-hook-after-branch completed 12 0ms ok 0
✅ peek-hook-at-registration completed 12 0ms ok 0
✅ race-hook-before-probe completed 12 0ms ok 0
✅ race-hook-after-probe completed 12 0ms ok 0
✅ race-duplicate-delivery completed 13 0ms ok 0
✅ attr-hook-before-step completed 11 0ms ok 0
✅ attr-hook-after-step completed 11 0ms ok 0
✅ attr-from-step-body completed 13 0ms ok 0
✅ fork-hook-after-timeout completed 14 1.0m ok 0
✅ fork-hook-before-timeout completed 14 1.0m ok 0
✅ count-hook-after-timeout completed 17 1.0m ok 0
✅ count-hook-before-timeout completed 20 1.0m ok 0
✅ stale-read-step-count-fork completed 20 1.0m ok 0
✅ stale-read-equal-step-counts completed 14 1.0m ok 0
✅ step-vs-step-fork completed 12 0ms ok 0
✅ step-vs-step-fork-fenced completed 12 0ms ok 0
✅ fence-catches-benign-direction completed 12 5ms ok 0
✅ in-flight-before-decision completed 17 1.0m ok 0
✅ in-flight-before-decision-counted completed 17 1.0m ok 0
✅ in-flight-after-decision completed 19 2.0m ok 0
✅ stale-read-step-count-fork-fenced completed 20 1.0m ok 0
✅ fork-hook-wins completed 13 1.0m ok 0
✅ fork-timeout-wins completed 13 1.0m ok 0
✅ unclaimed-payload-under-fork completed 17 1.0m ok 0
✅ claimed-payload-under-fork completed 17 1.0m ok 0
✅ writers-independent-step-bodies completed 12 0ms ok 0
✅ writers-scripted-tempo completed 12 0ms ok 0
✅ cancel-mid-step cancelled 7 0ms skipped 0

Full trace: world-sim.txt

@github-actions

Copy link
Copy Markdown
Contributor
Framework Flow route Step reg. Framework output
hono 267.4 KiB (±0) 95.4 KiB (±0) 1.99 MiB (-83 B)
nextjs-turbopack 274.8 KiB (±0) 426 B (±0) 970.2 KiB (+374 B)
About these numbers

Sizes are gzip; parentheses show the change against main.
Flow route and Step reg. gate this job, on raw bytes rather than the gzip shown, at max(2%, 50.0 KiB). Framework output is informational.

9c2dd9c · run

@alangenfeld
alangenfeld deleted the alangenfeld/mirror/pr-4828-ci branch October 12, 2026 17:23

This branch was successfully deployed

1 active deployment
Preview – workflow-docs — 9c2dd9c8 Deployed Oct 12, 2026 by vercel[bot]
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