Skip to content

feat(nitro): auto-start the World at server boot#2550

Merged
pranaygp merged 1 commit into
pgp/world-start-recoveryfrom
pgp/nitro-auto-world-start
Jun 21, 2026
Merged

feat(nitro): auto-start the World at server boot#2550
pranaygp merged 1 commit into
pgp/world-start-recoveryfrom
pgp/nitro-auto-world-start

Conversation

@pranaygp

Copy link
Copy Markdown
Contributor

Stacked on #2544 (pgp/world-start-recovery). Review now; merge after #2544 lands (GitHub will retarget the base to main automatically when #2544 merges). The diff below is only this PR's delta on top of #2544.

Context

#2544 added ensureWorldStarted() and wired boot-time World recovery across the framework integrations — but for Nitro it had to settle for manual wiring (a hand-written server/plugins/workflow.ts) after its auto-plugin was reverted. The auto-plugin imported the runtime via a build-time file:// URL, which collided with the bundled flow handler's copy of the same file:

ERR_INTERNAL_ASSERTION: ... imported again after being required

That CJS/ESM dual-load 500'd the flow route and broke the nitro+postgres e2e, so the plugin was dropped.

This PR brings the auto-plugin back — fixed — so self-hosted Nitro apps (Nitro v2/v3, Nuxt, Express/Hono/Fastify on Nitro) recover in-flight runs after a restart with no manual wiring.

The fix

Instead of a virtual module doing a file:// dynamic import, @workflow/nitro now emits a real plugin file in the build dir that imports workflow/runtime via a bare dynamic import — mirroring the hand-written Nitro plugin that already works (and that #2544's start-pg-world.ts used). The bundler resolves and dedupes it with the flow handler's runtime, so there's no second physical module loaded as both CJS and ESM. ensureWorldStarted() caches its start promise on globalThis, so the World starts exactly once. Registration is gated off Vercel deploys (the Vercel World's start() is a no-op).

Changes

  • @workflow/nitroaddStartupPlugin(): generate + register the boot plugin (gated !isVercelDeploy).
  • Remove the now-redundant manual workbench/nitro-v3/plugins/start-pg-world.ts + its nitro.config.ts entry.
  • Update the v4/v5 recovering-in-flight-runs docs: Nitro/Nuxt now say "no action required."
  • Changeset (@workflow/nitro, minor).

Test plan

Verified on workbench/nitro-v3 (local world), dev and production build:

  • The plugin runs at true bootworld.start() creates the local data dir before any request (no first-request dependency).
  • The flow handler serves HTTP 200 with zero ERR_INTERNAL_ASSERTION after the boot plugin has loaded the runtime — the exact regression that reverted the original is gone.
  • The generated plugin is bundled into .output/server/index.mjs (no file:// runtime import).

⚠️ The nitro + postgres prod e2e (restart-recovery.test.ts, the case that originally broke) requires a Postgres DB I couldn't run locally — please let CI exercise it before merge.

🤖 Generated with Claude Code

Re-introduce the dropped auto startup plugin so self-hosted Nitro apps
(Nitro v2/v3, Nuxt, Express/Hono/Fastify on Nitro) recover in-flight runs
after a restart with no manual wiring.

The previously-reverted version imported the runtime via a build-time
`file://` URL, which collided with the bundled flow handler's copy of the
same file (CJS/ESM dual-load -> ERR_INTERNAL_ASSERTION, 500ing the flow
route). This version instead emits a real plugin file in the build dir
that imports `workflow/runtime` via a *bare* dynamic import — mirroring a
hand-written Nitro plugin — so the bundler resolves and dedupes it with
the flow handler's runtime. `ensureWorldStarted()` caches its start
promise on `globalThis`, so the World starts exactly once. Gated off
Vercel deploys (the Vercel World's start() is a no-op).

Removes the manual `start-pg-world.ts` workbench workaround and updates
the recovering-in-flight-runs docs to note Nitro starts the World
automatically.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
@pranaygp pranaygp requested a review from a team as a code owner June 21, 2026 16:22
Copilot AI review requested due to automatic review settings June 21, 2026 16:22
@changeset-bot

changeset-bot Bot commented Jun 21, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2ae642b

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

This PR includes changesets to release 16 packages
Name Type
@workflow/nitro Minor
@workflow/nuxt Patch
workflow Patch
@workflow/world-testing Patch
@workflow/core Patch
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite 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 Jun 21, 2026

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Jun 21, 2026 4:25pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Jun 21, 2026 4:25pm
example-workflow Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workbench-astro-workflow Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workbench-express-workflow Error Error Jun 21, 2026 4:25pm
workbench-fastify-workflow Error Error Jun 21, 2026 4:25pm
workbench-hono-workflow Error Error Jun 21, 2026 4:25pm
workbench-nitro-workflow Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workbench-nuxt-workflow Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workbench-tanstack-start-workflow Error Error Jun 21, 2026 4:25pm
workbench-vite-workflow Error Error Jun 21, 2026 4:25pm
workflow-docs Ready Ready Preview, Comment, Open in v0 Jun 21, 2026 4:25pm
workflow-swc-playground Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workflow-tarballs Ready Ready Preview, Comment Jun 21, 2026 4:25pm
workflow-web Ready Ready Preview, Comment Jun 21, 2026 4:25pm

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

@github-actions

github-actions Bot commented Jun 21, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 941 1 122 1064
✅ 💻 Local Development 1401 0 119 1520
❌ 📦 Local Production 1274 127 119 1520
❌ 🐘 Local Postgres 1265 126 129 1520
✅ 📋 Other 382 0 76 458
Total 5263 254 565 6082

❌ Failed Tests

▲ Vercel Production (1 failed)

nuxt (1 failed):

📦 Local Production (127 failed)

nuxt-stable (127 failed):

  • addTenWorkflow | wrun_01KVNFX5R06C3KXAXG1TADC9K4
  • addTenWorkflow | wrun_01KVNFX5R06C3KXAXG1TADC9K4
  • deploymentId: 'latest' is a no-op in non-Vercel worlds
  • promiseAllWorkflow | wrun_01KVNFXC4R5WTA1WNHC5V0S76H
  • promiseRaceWorkflow | wrun_01KVNFXFTAY60Z70P1VR6NT6BT
  • promiseAnyWorkflow | wrun_01KVNFY55AM5XD5H3D8TJYC61E
  • readableStreamWorkflow | wrun_01KVNFYCTVB71R171698V0AVX9
  • hookWorkflow | wrun_01KVNFYP8BS8MPA5KM19HTV3X3
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KVNFYW035TWT2RV3F1D9FHG7
  • webhookWorkflow | wrun_01KVNFZ0G8K0A1WC2590M0687R
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race | wrun_01KVNFZ5VSVKEW2NVKKQ647X85
  • webhook route with invalid token
  • sleepingWorkflow | wrun_01KVNFZY3PHQNAPAGQ36FW34EJ
  • parallelSleepWorkflow | wrun_01KVNG0AGWX1SGKVXJAFXTBQHG
  • sleepWinsRaceWorkflow | wrun_01KVNG0FF55W8ZPAGGA4W28RPM
  • stepWinsRaceWorkflow | wrun_01KVNG0JPVGXE57720ENSXYH73
  • nullByteWorkflow | wrun_01KVNG0NP4HY2GJYTVE3ZVWPK8
  • workflowAndStepMetadataWorkflow | wrun_01KVNG0QMSYPSG25CT73HGN2NJ
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KVNG2VNETMSMFVA2M38R6HE1
  • utf8StreamWorkflow | wrun_01KVNG36XNRGPEFYXYG0K3T1MG
  • writableForwardedFromWorkflowWorkflow | wrun_01KVNG3C97CHDNJXTPZPBA83Y0
  • writableForwardedFromStepWorkflow | wrun_01KVNG3FJEDPSBHR1HA3Q6GEW6
  • fetchWorkflow | wrun_01KVNG3HHRZKHGMJASFYF1H55E
  • promiseRaceStressTestWorkflow | wrun_01KVNG3KFNQPHDJJMKNSQBTCEY
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • stepDirectCallWorkflow - calling step functions directly outside workflow context
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KVNG795VPGPEDW2D7KZD7400
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KVNG7KPQ4W10FHYTR1VCRH0N
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_01KVNG7Y7D5VC12QGTPFDSJS9Z
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_01KVNG8088QB2S2P135873D3GX
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_01KVNG8281AK65M1PW2G4QZ8N8
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_01KVNG849PM6D1BATRPETQ2GZ3
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_01KVNG8HF9EM4RFZ66PQ4XYGAH
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_01KVNG9ARG2SMS7CAGFHFZFG7J
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_01KVNG9EN0QCKB64QMMEP9288H
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_01KVNG9KG9WMP6A630YMH37NG1
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_01KVNG9PSX28C8BYZ0Q8M5KEJM
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_01KVNG9YCQ64WRRRDA4K6QKX3F
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KVNGA501Z56Y85XJRRMT746P
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KVNGAMP802JBHPE64HJARHWB
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KVNGAWK9EJJZJBKSFJN2NHGJ
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KVNGB1K0YKDA19NDVT7W4BKZ
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KVNGB3R7P61BSHV8MDRPD0NH
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KVNGBCSKEWWY6NZ6M7D3PK72
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_01KVNGBPXBG12S6TQ31DWK3XR7
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_01KVNGBSM0ABGXBAN34S57EJDJ
  • health check endpoint (HTTP) - workflow endpoint responds to __health query parameter
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KVNGC6RES3P43XXZPZWRX99K
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KVNGCBP5Q57MBHP8C6WT1YXH
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KVNGCGKX9C947TCS1GQZMKQM
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KVNGCNPTGGA581WK7DP1EX80
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KVNGCTZKAFR2D4B8V8G1KJH6
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KVNGCZV46G29JQH7NXD31XGT
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KVNGD50WC0SZXMSGSW3Y19M0
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KVNGDE6WNMZXKW2M8P98GQ10
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_01KVNGDMCTNY25RW1K00XWC9F2
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KVNGDPAMDZJ58GRVJR84P0SK
  • cancelRun - cancelling a running workflow | wrun_01KVNGDVGN40JDQB9J2ZF5KTTS
  • cancelRun via CLI - cancelling a running workflow | wrun_01KVNGE49SC3VCP408DMNC0B2X
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KVNGEFF6Z9079F8VXXFKM9KZ
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_01KVNGEXS9BDV9V2EQM41G12G1
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KVNGFCHCH19C8J7C822B3R7Y
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KVNGFN85W0YZM7HXH96JMRB2
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KVNGKQP08YDVD4PX9NDHPASB
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KVNGKSPN4TGVH5GEA73JS5AX
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KVNGKVNAKVQWN5K5Y5AX4Q3R
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KVNGKXMYHNDTSGFN42CXZ4Q1
  • distributedAbortController - manual abort triggers signal | wrun_01KVNGM2R2RN060F1GCDRGENMH
  • distributedAbortController - TTL expiration triggers signal | wrun_01KVNGM5MF58DVZ08VHE5BKP65
  • distributedAbortController - reconnect to existing controller | wrun_01KVNGMA9FFRKSZ6QHVXZP37MK
  • experimental_setAttributes start: initial attributes are seeded on run creation
  • experimental_setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • experimental_setAttributes experimentalSetAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • experimental_setAttributes experimentalSetAttributesInsideStepWorkflow: step-body calls append attributed native events
  • experimental_setAttributes fire-and-forget: void experimental_setAttributes lands without awaiting
  • experimental_setAttributes Promise.all of disjoint-key writes: every key lands
  • experimental_setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • experimental_setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit
  • experimental_setAttributes start: invalid initial attributes are rejected before a run is created
🐘 Local Postgres (126 failed)

nuxt-stable (126 failed):

  • addTenWorkflow | wrun_01KVNFX5R06C3KXAXG1TADC9K4
  • addTenWorkflow | wrun_01KVNFX5R06C3KXAXG1TADC9K4
  • deploymentId: 'latest' is a no-op in non-Vercel worlds
  • promiseAllWorkflow | wrun_01KVNFXC4R5WTA1WNHC5V0S76H
  • promiseRaceWorkflow | wrun_01KVNFXFTAY60Z70P1VR6NT6BT
  • promiseAnyWorkflow | wrun_01KVNFY55AM5XD5H3D8TJYC61E
  • readableStreamWorkflow | wrun_01KVNFYCTVB71R171698V0AVX9
  • hookWorkflow | wrun_01KVNFYP8BS8MPA5KM19HTV3X3
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KVNFYW035TWT2RV3F1D9FHG7
  • webhookWorkflow | wrun_01KVNFZ0G8K0A1WC2590M0687R
  • webhook route with invalid token
  • sleepingWorkflow | wrun_01KVNFZY3PHQNAPAGQ36FW34EJ
  • parallelSleepWorkflow | wrun_01KVNG0AGWX1SGKVXJAFXTBQHG
  • sleepWinsRaceWorkflow | wrun_01KVNG0FF55W8ZPAGGA4W28RPM
  • stepWinsRaceWorkflow | wrun_01KVNG0JPVGXE57720ENSXYH73
  • nullByteWorkflow | wrun_01KVNG0NP4HY2GJYTVE3ZVWPK8
  • workflowAndStepMetadataWorkflow | wrun_01KVNG0QMSYPSG25CT73HGN2NJ
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_01KVNG2VNETMSMFVA2M38R6HE1
  • utf8StreamWorkflow | wrun_01KVNG36XNRGPEFYXYG0K3T1MG
  • writableForwardedFromWorkflowWorkflow | wrun_01KVNG3C97CHDNJXTPZPBA83Y0
  • writableForwardedFromStepWorkflow | wrun_01KVNG3FJEDPSBHR1HA3Q6GEW6
  • fetchWorkflow | wrun_01KVNG3HHRZKHGMJASFYF1H55E
  • promiseRaceStressTestWorkflow | wrun_01KVNG3KFNQPHDJJMKNSQBTCEY
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • stepDirectCallWorkflow - calling step functions directly outside workflow context
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KVNG795VPGPEDW2D7KZD7400
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KVNG7KPQ4W10FHYTR1VCRH0N
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_01KVNG7Y7D5VC12QGTPFDSJS9Z
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_01KVNG8088QB2S2P135873D3GX
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_01KVNG8281AK65M1PW2G4QZ8N8
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_01KVNG849PM6D1BATRPETQ2GZ3
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_01KVNG8HF9EM4RFZ66PQ4XYGAH
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_01KVNG9ARG2SMS7CAGFHFZFG7J
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_01KVNG9EN0QCKB64QMMEP9288H
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_01KVNG9KG9WMP6A630YMH37NG1
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_01KVNG9PSX28C8BYZ0Q8M5KEJM
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_01KVNG9YCQ64WRRRDA4K6QKX3F
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KVNGA501Z56Y85XJRRMT746P
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KVNGAMP802JBHPE64HJARHWB
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KVNGAWK9EJJZJBKSFJN2NHGJ
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KVNGB1K0YKDA19NDVT7W4BKZ
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KVNGB3R7P61BSHV8MDRPD0NH
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KVNGBCSKEWWY6NZ6M7D3PK72
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_01KVNGBPXBG12S6TQ31DWK3XR7
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_01KVNGBSM0ABGXBAN34S57EJDJ
  • health check endpoint (HTTP) - workflow endpoint responds to __health query parameter
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KVNGC6RES3P43XXZPZWRX99K
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KVNGCBP5Q57MBHP8C6WT1YXH
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KVNGCGKX9C947TCS1GQZMKQM
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KVNGCNPTGGA581WK7DP1EX80
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KVNGCTZKAFR2D4B8V8G1KJH6
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KVNGCZV46G29JQH7NXD31XGT
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KVNGD50WC0SZXMSGSW3Y19M0
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KVNGDE6WNMZXKW2M8P98GQ10
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_01KVNGDMCTNY25RW1K00XWC9F2
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KVNGDPAMDZJ58GRVJR84P0SK
  • cancelRun - cancelling a running workflow | wrun_01KVNGDVGN40JDQB9J2ZF5KTTS
  • cancelRun via CLI - cancelling a running workflow | wrun_01KVNGE49SC3VCP408DMNC0B2X
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KVNGEFF6Z9079F8VXXFKM9KZ
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_01KVNGEXS9BDV9V2EQM41G12G1
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KVNGFCHCH19C8J7C822B3R7Y
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KVNGFN85W0YZM7HXH96JMRB2
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KVNGKQP08YDVD4PX9NDHPASB
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KVNGKSPN4TGVH5GEA73JS5AX
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KVNGKVNAKVQWN5K5Y5AX4Q3R
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KVNGKXMYHNDTSGFN42CXZ4Q1
  • distributedAbortController - manual abort triggers signal | wrun_01KVNGM2R2RN060F1GCDRGENMH
  • distributedAbortController - TTL expiration triggers signal | wrun_01KVNGM5MF58DVZ08VHE5BKP65
  • distributedAbortController - reconnect to existing controller | wrun_01KVNGMA9FFRKSZ6QHVXZP37MK
  • experimental_setAttributes start: initial attributes are seeded on run creation
  • experimental_setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • experimental_setAttributes experimentalSetAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • experimental_setAttributes experimentalSetAttributesInsideStepWorkflow: step-body calls append attributed native events
  • experimental_setAttributes fire-and-forget: void experimental_setAttributes lands without awaiting
  • experimental_setAttributes Promise.all of disjoint-key writes: every key lands
  • experimental_setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • experimental_setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit
  • experimental_setAttributes start: invalid initial attributes are rejected before a run is created

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 125 0 27
✅ example 125 0 27
✅ nextjs-turbopack 149 0 3
✅ nextjs-webpack 149 0 3
✅ nitro 125 0 27
❌ nuxt 124 1 27
✅ sveltekit 144 0 8
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 152 0 0
✅ nitro-stable 127 0 25
✅ nuxt-stable 127 0 25
✅ sveltekit-stable 146 0 6
❌ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 127 0 25
✅ nextjs-turbopack-canary 133 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 152 0 0
✅ nextjs-webpack-canary 133 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 152 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 152 0 0
✅ nitro-stable 127 0 25
❌ nuxt-stable 0 127 25
✅ sveltekit-stable 146 0 6
❌ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 126 0 26
✅ nextjs-turbopack-canary 132 0 20
✅ nextjs-turbopack-stable-lazy-discovery-disabled 151 0 1
✅ nextjs-turbopack-stable-lazy-discovery-enabled 151 0 1
✅ nextjs-webpack-canary 132 0 20
✅ nextjs-webpack-stable-lazy-discovery-disabled 151 0 1
✅ nextjs-webpack-stable-lazy-discovery-enabled 151 0 1
✅ nitro-stable 126 0 26
❌ nuxt-stable 0 126 26
✅ sveltekit-stable 145 0 7
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 127 0 25
✅ e2e-local-postgres-nest-stable 126 0 26
✅ e2e-local-prod-nest-stable 127 0 25
✅ e2e-restart-recovery-local 1 0 0
✅ e2e-restart-recovery-postgres 1 0 0

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@vercel vercel Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

Five workbench apps still reference the deleted plugins/start-pg-world.ts (via symlinked plugins dirs), causing "Module not found" build failures.

Fix on Vercel

@pranaygp pranaygp merged commit 2ae642b into pgp/world-start-recovery Jun 21, 2026
73 of 103 checks passed
@pranaygp pranaygp deleted the pgp/nitro-auto-world-start branch June 21, 2026 16:31
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