Skip to content

[DO NOT MERGE] CI dry-run: QuickJS as the default workflow VM engine - #3253

Draft
TooTallNate wants to merge 2 commits into
quickjs-vm-threshold-snapshotsfrom
quickjs-vm-default
Draft

[DO NOT MERGE] CI dry-run: QuickJS as the default workflow VM engine#3253
TooTallNate wants to merge 2 commits into
quickjs-vm-threshold-snapshotsfrom
quickjs-vm-default

Conversation

@TooTallNate

@TooTallNate TooTallNate commented Jul 31, 2026

Copy link
Copy Markdown
Member

Warning

Not intended to merge. This PR exists to exercise the full CI matrix — and the event-log-race-repro stress workflow (via its label) — with QuickJS as the default engine, as a dress rehearsal for an eventual real default flip. It stays a draft; when the underlying stack (#3048#3049#3250#3251, plus #3263) is merged, a fresh flip PR will be cut against main with the learnings from this one.

What it changes (for the dry run)

  • useQuickJSVm defaults to the QuickJS engine when neither the run's stamped executionContext.workflowVm nor WORKFLOW_VM specifies one; WORKFLOW_VM=node is the explicit node:vm opt-in.
  • CI matrix inverted to match: quickjs legs leave WORKFLOW_VM unset (exercising the default-selection path end to end); node legs opt in explicitly. Labels/artifacts unchanged via MATRIX_VM.
  • Entrypoint test suites that assert node replay-loop internals pin WORKFLOW_VM=node (see the comment at each pin).
  • Docs updated for the flipped default.

Findings so far (feeding the real flip PR)

  • The event-ceiling gap this PR's CI exposed (event-limit red) was real and is fixed on QuickJS engine: inline step execution + WASM module caching #3049 (in-loop re-check + run_failed/MAX_EVENTS_EXCEEDED conversion).
  • The global-surface gap is substantially closed on Add opt-in QuickJS WASM VM engine (WORKFLOW_VM=quickjs) #3048 (deterministic crypto, frozen process.env, loud Intl/locale guards); remaining differences are enumerated in the docs.
  • Outstanding requirement for the real flip: unconditional engine stamping at start() — under a flipped default, unset WORKFLOW_VM currently produces unstamped runs that would switch engines mid-run on rollback (review finding on this PR). The real flip PR must stamp the resolved engine.

@TooTallNate
TooTallNate requested review from a team and ijjk as code owners July 31, 2026 08:52
Copilot AI review requested due to automatic review settings July 31, 2026 08:52
@changeset-bot

changeset-bot Bot commented Jul 31, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 74bd053

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

This PR includes changesets to release 16 packages
Name Type
@workflow/core Minor
@workflow/builders Patch
@workflow/cli Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/vitest Patch
@workflow/web-shared Patch
@workflow/web Patch
workflow Minor
@workflow/world-testing 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

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.

@vercel

vercel Bot commented Jul 31, 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 Aug 4, 2026 12:32am
example-nextjs-workflow-webpack Ready Ready Preview Aug 4, 2026 12:32am
example-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-astro-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-express-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-fastify-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-hono-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-nestjs-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-nitro-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-nuxt-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-sveltekit-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-tanstack-start-workflow Ready Ready Preview Aug 4, 2026 12:32am
workbench-vite-workflow Ready Ready Preview Aug 4, 2026 12:32am
workflow-docs Ready Ready Preview, v0 Aug 4, 2026 12:32am
workflow-swc-playground Ready Ready Preview Aug 4, 2026 12:32am
workflow-tarballs Ready Ready Preview Aug 4, 2026 12:32am
workflow-web Ready Ready Preview Aug 4, 2026 12:32am

@TooTallNate TooTallNate added the event-log-race-repro Run the event log race reproduction job label Jul 31, 2026
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (560 failed)

astro-node (35 failed):

  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ53CY9S0GVA3WZH88E1KG0J | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ53D9VA0GK9GEVCJFNCCFYA | 🔍 observability
  • 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 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 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 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-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • setAttributes start: initial attributes are seeded on run creation

astro-quickjs (12 failed):

  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability

example-node (26 failed):

  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ53CY9S0GVA3WZH88E1KG0J | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ53D9VA0GK9GEVCJFNCCFYA | 🔍 observability
  • 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 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

example-quickjs (20 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability

express-node (26 failed):

  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries

express-quickjs (26 failed):

  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability

fastify-node (23 failed):

  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ53CY9S0GVA3WZH88E1KG0J | 🔍 observability
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input

fastify-quickjs (21 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability

hono-node (16 failed):

  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability

hono-quickjs (18 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability

nextjs-turbopack-node (30 failed):

  • 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
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ538R050GS2DAYXH5R4S4ND | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • pages router promiseAllWorkflow via pages router

nextjs-turbopack-quickjs (17 failed):

  • 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
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ538R050GS2DAYXH5R4S4ND | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step

nextjs-webpack-node (19 failed):

  • 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
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ538R050GS2DAYXH5R4S4ND | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability

nextjs-webpack-quickjs (25 failed):

  • 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
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ538R050GS2DAYXH5R4S4ND | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ53CY9S0GVA3WZH88E1KG0J | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ53D9VA0GK9GEVCJFNCCFYA | 🔍 observability

nitro-node (22 failed):

  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step

nitro-quickjs (19 failed):

  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps

nuxt-node (52 failed):

  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • 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 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_41KZ53HM6B0GKRSCA66VNR6VW1 | 🔍 observability
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_41KZ53HPFN0GX0F5CM1C05F35P | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KZ53HRQ20GJSK8NQWRQ6YBCP | 🔍 observability
  • distributedAbortController - TTL expiration triggers signal | wrun_41KZ53J5420GMA387DGVYC2M40 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41KZ53JCT20GHY8JGVYHF7FKKV | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nuxt-quickjs (24 failed):

  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability

sveltekit-node (50 failed):

  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ53D9VA0GK9GEVCJFNCCFYA | 🔍 observability
  • 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 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
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

sveltekit-quickjs (19 failed):

  • sleepWinsRaceWorkflow | wrun_41KZ530NKQ0GXM3916W3RERFR3 | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ538R050GS2DAYXH5R4S4ND | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability

vite-node (33 failed):

  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ53CY9S0GVA3WZH88E1KG0J | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ53D9VA0GK9GEVCJFNCCFYA | 🔍 observability
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • 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 abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires

vite-quickjs (27 failed):

  • sleepWinsRaceWorkflow | wrun_41KZ530NKQ0GXM3916W3RERFR3 | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ5394FZ0GZZWP7KD1K9ANRX | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ537ZQX0GXC0WKRZ3N9VVM7 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ5381XF0GS0PXNE0C2RW4SC | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ53844V0GZTQJ9C0ZYWQ9PS | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708 | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4 | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4 | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1 | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0 | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM | 🔍 observability
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op

💻 Local Development (2 failed)

astro-stable-node (1 failed):

  • webhookWorkflow | wrun_41KZ52Z71N0GVDS9S8T64HK3N1

sveltekit-stable-node (1 failed):

  • webhookWorkflow | wrun_41KZ52Z71N0GVDS9S8T64HK3N1
📋 Other (94 failed)

e2e-vercel-prod-nest-node (33 failed):

  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ53CY9S0GVA3WZH88E1KG0J
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • 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 abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • distributedAbortController - manual abort triggers signal | wrun_41KZ53J26H0GPAX5MAGFPTDHJJ

e2e-vercel-prod-nest-quickjs (14 failed):

  • sleepWinsRaceWorkflow | wrun_41KZ530NKQ0GXM3916W3RERFR3
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ53869X0GPZ13SAHCZ04HCC
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ539NM10GR57YZGQ2N09ES0
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF

e2e-vercel-prod-tanstack-start-node (17 failed):

  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ53DBY50GW0MJN1HTABV6D1
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ53D9VA0GK9GEVCJFNCCFYA

e2e-vercel-prod-tanstack-start-quickjs (30 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ538JCZ0GPA3RDVDRYN7JGT
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ538TG30GYNW8ZXC81NQJB2
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ539FTK0GYH48HWM87JXMXD
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ539TQ70GR2X6A3T3WV79BV
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ539XGA0GVE14PFNA8X6708
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ539GJ20GK8W4R8FB8X17JG
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ539MM90GQJXHWAS9RQ66N4
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ53B4K60GWEV50DC8TAA27B
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ53BF6C0GXBXFAT0920G57T
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ53BPAE0GGSS9FNNP3594EP
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ539S940GQDM5S29SJZZK4Q
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ53A5890GHJ3VB6CSBC8QE4
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ53AA5Z0GSVCTC5VBAWXHKY
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ53AD8J0GQBHP1222CHPGTE
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ53D5J00GZ03BEJ2S00644H
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ53A21P0GZ87Y3QGQDNXBE0
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ53A4890GZWC0TWHF0ENBER
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ53AYCZ0GJVV0QGA7CM548Z
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ53B4F40GHNTATQDWN1GVEF
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ53BAH30GS10FKQQ44M5S8E
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ53BEDY0GW4BGZ2X3W3GP2G
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ53BNGV0GTBM3A14RAE2KXF
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ53BR0Y0GX0W4MXJ33NM28P
  • cancelRun - cancelling a running workflow | wrun_41KZ53BY040GQPYEYWVGW748KS
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ53C3AF0GSWSB6FB99QAFBJ
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ53CBEN0GYEADJJWRT88EVM
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ53CPG60GNC76D4CVNEFCGD
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook

E2E Test Summary

Summary
Passed Failed Skipped Total
❌ ▲ Vercel Production 2372 560 478 3410
❌ 💻 Local Development 3419 2 454 3875
✅ 📦 Local Production 3421 0 454 3875
✅ 🐘 Local Postgres 3421 0 454 3875
✅ 🪟 Windows 310 0 0 310
❌ 📋 Other 1962 94 424 2480
✅ vercel-multi-region 27 0 0 27
Total 14932 656 2264 17852
Details by Category

❌ ▲ Vercel Production

App Passed Failed Skipped
❌ astro-node 92 35 28
❌ astro-quickjs 115 12 28
❌ example-node 101 26 28
❌ example-quickjs 107 20 28
❌ express-node 101 26 28
❌ express-quickjs 101 26 28
❌ fastify-node 104 23 28
❌ fastify-quickjs 106 21 28
❌ hono-node 111 16 28
❌ hono-quickjs 109 18 28
❌ nextjs-turbopack-node 122 30 3
❌ nextjs-turbopack-quickjs 135 17 3
❌ nextjs-webpack-node 133 19 3
❌ nextjs-webpack-quickjs 127 25 3
❌ nitro-node 105 22 28
❌ nitro-quickjs 108 19 28
❌ nuxt-node 75 52 28
❌ nuxt-quickjs 103 24 28
❌ sveltekit-node 96 50 9
❌ sveltekit-quickjs 127 19 9
❌ vite-node 94 33 28
❌ vite-quickjs 100 27 28

❌ 💻 Local Development

App Passed Failed Skipped
❌ astro-stable-node 128 1 26
✅ astro-stable-quickjs 129 0 26
✅ express-stable-node 129 0 26
✅ express-stable-quickjs 129 0 26
✅ fastify-stable-node 129 0 26
✅ fastify-stable-quickjs 129 0 26
✅ hono-stable-node 129 0 26
✅ hono-stable-quickjs 129 0 26
✅ nextjs-turbopack-canary-node 136 0 19
✅ nextjs-turbopack-canary-quickjs 136 0 19
✅ nextjs-turbopack-quickjs-snapshot 155 0 0
✅ nextjs-turbopack-stable-node 155 0 0
✅ nextjs-turbopack-stable-quickjs 155 0 0
✅ nextjs-webpack-canary-node 136 0 19
✅ nextjs-webpack-canary-quickjs 136 0 19
✅ nextjs-webpack-stable-node 155 0 0
✅ nextjs-webpack-stable-quickjs 155 0 0
✅ nitro-stable-node 129 0 26
✅ nitro-stable-quickjs 129 0 26
✅ nuxt-stable-node 129 0 26
✅ nuxt-stable-quickjs 129 0 26
❌ sveltekit-stable-node 147 1 7
✅ sveltekit-stable-quickjs 148 0 7
✅ vite-stable-node 129 0 26
✅ vite-stable-quickjs 129 0 26

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable-node 129 0 26
✅ astro-stable-quickjs 129 0 26
✅ express-stable-node 129 0 26
✅ express-stable-quickjs 129 0 26
✅ fastify-stable-node 129 0 26
✅ fastify-stable-quickjs 129 0 26
✅ hono-stable-node 129 0 26
✅ hono-stable-quickjs 129 0 26
✅ nextjs-turbopack-canary-node 136 0 19
✅ nextjs-turbopack-canary-quickjs 136 0 19
✅ nextjs-turbopack-quickjs-snapshot 155 0 0
✅ nextjs-turbopack-stable-node 155 0 0
✅ nextjs-turbopack-stable-quickjs 155 0 0
✅ nextjs-webpack-canary-node 136 0 19
✅ nextjs-webpack-canary-quickjs 136 0 19
✅ nextjs-webpack-stable-node 155 0 0
✅ nextjs-webpack-stable-quickjs 155 0 0
✅ nitro-stable-node 129 0 26
✅ nitro-stable-quickjs 129 0 26
✅ nuxt-stable-node 129 0 26
✅ nuxt-stable-quickjs 129 0 26
✅ sveltekit-stable-node 148 0 7
✅ sveltekit-stable-quickjs 148 0 7
✅ vite-stable-node 129 0 26
✅ vite-stable-quickjs 129 0 26

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable-node 129 0 26
✅ astro-stable-quickjs 129 0 26
✅ express-stable-node 129 0 26
✅ express-stable-quickjs 129 0 26
✅ fastify-stable-node 129 0 26
✅ fastify-stable-quickjs 129 0 26
✅ hono-stable-node 129 0 26
✅ hono-stable-quickjs 129 0 26
✅ nextjs-turbopack-canary-node 136 0 19
✅ nextjs-turbopack-canary-quickjs 136 0 19
✅ nextjs-turbopack-quickjs-snapshot 155 0 0
✅ nextjs-turbopack-stable-node 155 0 0
✅ nextjs-turbopack-stable-quickjs 155 0 0
✅ nextjs-webpack-canary-node 136 0 19
✅ nextjs-webpack-canary-quickjs 136 0 19
✅ nextjs-webpack-stable-node 155 0 0
✅ nextjs-webpack-stable-quickjs 155 0 0
✅ nitro-stable-node 129 0 26
✅ nitro-stable-quickjs 129 0 26
✅ nuxt-stable-node 129 0 26
✅ nuxt-stable-quickjs 129 0 26
✅ sveltekit-stable-node 148 0 7
✅ sveltekit-stable-quickjs 148 0 7
✅ vite-stable-node 129 0 26
✅ vite-stable-quickjs 129 0 26

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 155 0 0
✅ nextjs-turbopack-quickjs 155 0 0

❌ 📋 Other

App Passed Failed Skipped
✅ e2e-local-dev-nest-stable-node 129 0 26
✅ e2e-local-dev-nest-stable-quickjs 129 0 26
✅ e2e-local-dev-tanstack-start-node 129 0 26
✅ e2e-local-dev-tanstack-start-quickjs 129 0 26
✅ e2e-local-postgres-nest-stable-node 129 0 26
✅ e2e-local-postgres-nest-stable-quickjs 129 0 26
✅ e2e-local-postgres-tanstack-start-node 129 0 26
✅ e2e-local-postgres-tanstack-start-quickjs 129 0 26
✅ e2e-local-prod-nest-stable-node 129 0 26
✅ e2e-local-prod-nest-stable-quickjs 129 0 26
✅ e2e-local-prod-tanstack-start-node 129 0 26
✅ e2e-local-prod-tanstack-start-quickjs 129 0 26
❌ e2e-vercel-prod-nest-node 94 33 28
❌ e2e-vercel-prod-nest-quickjs 113 14 28
❌ e2e-vercel-prod-tanstack-start-node 110 17 28
❌ e2e-vercel-prod-tanstack-start-quickjs 97 30 28

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

📋 View full workflow run

@TooTallNate
TooTallNate marked this pull request as draft July 31, 2026 08:53

@VaguelySerious VaguelySerious left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

AI review: blocking issues found

Comment thread packages/core/src/runtime/vm-mode.ts
Comment thread docs/content/docs/v5/configuration/runtime-tuning.mdx
Comment thread docs/content/docs/v5/configuration/runtime-tuning.mdx
Comment thread packages/core/src/runtime.test.ts
…ck into node:vm)

- useQuickJSVm defaults to the QuickJS engine when neither the run's
  stamped executionContext.workflowVm nor WORKFLOW_VM specifies one;
  WORKFLOW_VM=node is the explicit node:vm opt-in.
- CI matrix inverted to match: quickjs legs leave WORKFLOW_VM unset so
  the default-selection path is exercised end to end; node legs opt in
  explicitly (labels/artifacts unchanged via MATRIX_VM).
- Entrypoint tests that assert node replay-loop internals against mock
  worlds pin WORKFLOW_VM=node (the quickjs path would instantiate a WASM
  VM per call).
- Docs + changeset updated. Runs keep the engine stamped at start().
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

The benchmark run for 74bd053 failed. See the run logs for details.

Partial results from the failed run:

commit 74bd053 · Tue, 04 Aug 2026 01:01:14 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 2144 (+213%) 🔻 2365 🔴 (+148%) 🔻 2481 🔴 (+150%) 🔻 6410 🔴 (+291%) 🔻 30
TTFS stream 2087 (+125%) 🔻 2270 🔴 (+132%) 🔻 2337 🔴 (+135%) 🔻 2587 🔴 (+153%) 🔻 30
TTFS hook + stream 2171 (+505%) 🔻 2423 🔴 (+99%) 🔻 2463 🔴 (+86%) 🔻 2846 🔴 (+66%) 🔻 30
STSO 1020 steps (inline) 221 (+163%) 🔻 1005 (+553%) 🔻 1237 (+583%) 🔻 1614 (+386%) 🔻 1018
STSO 1020 steps (queue-hop) 4439 (+113%) 🔻 4439 (+113%) 🔻 4439 (+113%) 🔻 4439 (+113%) 🔻 1
WO 1020 steps 776076 (+399%) 🔻 776076 (+399%) 🔻 776076 (+399%) 🔻 776076 (+399%) 🔻 1
SO stream overhead (text) 127 (-5.2%) 188 (-28%) 💚 235 (-26%) 💚 518 (+24%) 🔻 30
SO stream overhead (structured) 116 (-4.1%) 184 (-17%) 💚 193 (-43%) 💚 311 (-51%) 💚 30
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 152131ms → this run 769388ms (Δ +617257ms, +406%)

   50-100 ms  ┃                         main   3  this   0    -3
  100-150 ms  ┃███████████████████████  main 713  this   0  -713
  150-200 ms  ┃███████                  main 237  this   0  -237
  200-250 ms  ┃                         main  40  this  24   -16
  250-300 ms  █┃                        main  10  this  61   +51
  300-350 ms  █┃                        main   6  this  65   +59
  350-400 ms  █┃                        main   4  this  55   +51
  400-450 ms  ░┃                        main   0  this  71   +71
  450-500 ms  ┃                         main   1  this  37   +36
  500-550 ms  ┃                         main   0  this  24   +24
  550-600 ms  ┃                         main   1  this  43   +42
  600-650 ms  █┃                        main   1  this  59   +58
  650-700 ms  ░┃                        main   0  this  52   +52
  700-750 ms  ░┃                        main   0  this  53   +53
  750-800 ms  ░┃                        main   0  this  54   +54
  800-850 ms  ░┃                        main   0  this  49   +49
  850-900 ms  ░┃                        main   0  this  46   +46
  900-950 ms  ┃                         main   0  this  35   +35
 950-1000 ms  ┃                         main   0  this  34   +34
1000-1050 ms  ┃                         main   1  this  34   +33
1050-1100 ms  ┃                         main   0  this  33   +33
1100-1150 ms  ┃                         main   0  this  29   +29
1150-1200 ms  ┃                         main   0  this  39   +39
1200-1250 ms  ┃                         main   0  this  25   +25
1250-1300 ms  ┃                         main   0  this  30   +30
1300-1350 ms  ┃                         main   0  this  24   +24
1350-1400 ms  ┃                         main   0  this   9    +9
1400-1450 ms  ┃                         main   0  this   9    +9
1450-1500 ms  ┃                         main   0  this   7    +7
1500-1550 ms  ┃                         main   0  this   5    +5
1550-1600 ms  ┃                         main   0  this   1    +1
1600-1650 ms  ┃                         main   0  this   2    +2
1650-1700 ms  ┃                         main   0  this   1    +1
1700-1750 ms  ┃                         main   0  this   1    +1
1750-1800 ms  ┃                         main   0  this   1    +1
1800-1850 ms  ┃                         main   0  this   1    +1
1850-1900 ms  ┃                         main   0  this   1    +1
1950-2000 ms  ┃                         main   0  this   1    +1
3350-3400 ms  ┃                         main   1  this   0    -1
4150-4200 ms  ┃                         main   0  this   1    +1
5200-5250 ms  ┃                         main   0  this   2    +2

1020 steps (queue-hop)

Cumulative STSO time: main 2084ms → this run 4439ms (Δ +2355ms, +113%)

2000-2500 ms  ┃███████████████████████  main 1  this 0  -1
4000-4500 ms  ░░░░░░░░░░░░░░░░░░░░░░░┃  main 0  this 1  +1
📜 Previous results (1)

6af2c2c

Fri, 31 Jul 2026 23:40:21 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
STSO 1020 steps (inline) 218 (+69%) 🔻 1062 (+134%) 🔻 1253 (+147%) 🔻 1578 (+120%) 🔻 1017
STSO 1020 steps (queue-hop) 4670 (+213%) 🔻 6273 (+99%) 🔻 6273 (+99%) 🔻 6273 (+99%) 🔻 2
WO 1020 steps 835997 (+114%) 🔻 835997 (+114%) 🔻 835997 (+114%) 🔻 835997 (+114%) 🔻 1
SL stream latency 95 (+27%) 🔻 139 🔴 (+21%) 🔻 144 🔴 (+13%) 448 🔴 (+32%) 🔻 30
SO stream overhead (text) 112 (+12%) 218 (+60%) 🔻 254 (+49%) 🔻 513 (+134%) 🔻 30
SO stream overhead (structured) 135 (+32%) 🔻 265 🔴 (+39%) 🔻 406 (+73%) 🔻 1205 🔴 (+86%) 🔻 30
ℹ️ Metric definitions & methodology

The collapsed STSO distribution section above buckets every step gap of the sequential-steps run (not a sampled window), split by whether the step ending the gap ran inline — in the same warm process as the step before it, so the gap is pure framework overhead — or after a queue-hop — the first step of a fresh process, which pays queue dispatch, client reinit and event-log replay. Bars overlay the two runs: is main, marks where this run lands, bridges the gap when this run has more samples in a bucket.

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, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt) · SO: stream overhead (end-to-end write+consume time beyond the modelled generation window)

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 · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt) · stream overhead (text): writer streams 300 variable-length text token deltas paced at 100/s for 3s (a haiku-size LLM's token throughput) while a parallel reader drains the whole stream; SO is the end-to-end write+consume time beyond the 3s generation window (overhead/backpressure) · stream overhead (structured): same workload as stream overhead (text), but each delta is an AI-SDK-style structured object ({ type: 'text-delta', id, text }) instead of a raw string, so the SO gap vs the text scenario is the added serialization cost

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

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@pranaygp

pranaygp commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

Ran the event-log-race-repro storm locally against this branch on world-local and world-postgres (24 step-storm + 24 hook-storm per condition, concurrency 6, nextjs-turbopack production server; same harness as the event-log-race-repro CI label). Control = this same branch with WORKFLOW_RUNTIME=node, so the only delta is the VM.

condition world step-storm hook-storm
node VM (control) local 24 corrupted / 0 completed 21 corrupted / 3 completed
QuickJS local 0 corrupted / 24 stuck 0 corrupted / 24 stuck
node VM (control) postgres¹ 3 corrupted / 12 stuck 0 corrupted / 6 stuck
QuickJS postgres¹ 0 corrupted / 12 stuck 0 corrupted / 6 stuck + 1 err

¹ partial runs (21 and 19 landed of 48) — the launch budget cut them short.

Caveat before reading the zero: under QuickJS not a single storm run completed — every run blew past the harness's 240s cap (stuck = alive but too slow, not wedged). The storm's corruption mechanism needs tight races (watchdog-vs-step within ~300ms windows, concurrent replays interleaving), and the interpreter is slow enough that those races mostly never happen. So on this evidence QuickJS starves the repro rather than beating it — the 0 is a throughput artifact, not a demonstrated determinism win. The node control on the same branch reproducing main-level saturation (24/24, 21/24 on local) confirms the harness itself was working.

A fair comparison needs EVENT_LOG_RACE_REPRO_RUN_TIMEOUT_MS raised (600s+) so QuickJS runs can actually complete, then corruption compared per completed run. For reference, the same harness on the storage-side fix (#3269) reached hook-storm 0 corrupted / 24 completed on world-postgres — completions are what make a zero meaningful.

@pranaygp

pranaygp commented Aug 4, 2026

Copy link
Copy Markdown
Contributor

Re-ran against the latest head (6af2c2c) with the harness run-timeout raised 240s → 600s so QuickJS runs get a fair chance to complete, plus a variant with the newest stack layer (#3263's cecd664a0, host-side serde via handles — not yet restacked into this branch) merged on top. Node control = same build, WORKFLOW_VM=node. 24 step-storm + 24 hook-storm per condition, world-postgres numbers from the per-run event logs.

condition (600s timeout) world step-storm hook-storm completed-run time
node control local 18 corrupt / 6 stuck / 0 ok 14 corrupt / 2 stuck / 8 err
node control postgres 15 corrupt / 9 ok 1 corrupt / 23 ok p50 72s / p90 84s
QuickJS (this head) local 0 corrupt / 24 stuck 0 corrupt / 24 stuck none completed
QuickJS (this head) postgres 0 corrupt / all stuck 0 corrupt / all stuck none completed
QuickJS + #3263 serde (local merge) local 0 corrupt / 24 stuck 0 corrupt / 24 stuck none completed
QuickJS + #3263 serde (local merge) postgres 0 corrupt / 16 stuck / 2 err 0 corrupt / 24 stuck none completed

Performance (postgres, from event-log forensics):

  • node control: completed runs write ~603 events over ~71s ≈ 9 events/s sustained.
  • QuickJS as-shipped: runs were still appending when the 600s cap hit — p50 739 events at cutoff ≈ 1.2 events/s, a ~7–8× slowdown, with zero runs completing a workload node finishes in 72s. Storms this shape can't race at that speed, so "0 corrupted" remains a throughput artifact; the node control on the identical build still reproduces heavily.
  • QuickJS + the new QuickJS engine: host-side, side-effect-free serialization via handles #3263 serde commit: not slow — dormant. 38/42 runs burst ~98 events in the first ~8s (near node pace!) and then append nothing for the remaining ~10 minutes, no errors logged; stalled runs end on step_completed / hook_received — i.e. work landed and the run was never successfully resumed. The other 4 failed with USER_ERROR ("QuickJS runtime: workflow failed"). Caveat: I produced this tree by locally merging quickjs-host-serde onto this branch (clean, serde-scoped merge) since the restack hasn't happened — so it could be a serde×snapshotting interaction rather than QuickJS engine: host-side, side-effect-free serialization via handles #3263 alone, but the delta vs this head (continuous slow progress → hard stall at round ~1) is stark and reproducible across 62 runs.

Takeaways: (1) the corruption repro is alive on this branch under node; (2) a QuickJS corruption comparison is not yet meaningful — completion rate is 0/144 across every QuickJS condition even at 600s; (3) the ~8× interpreter gap is the first-order blocker, and the new serde layer (as merged here) introduces a wake/dormancy bug worth catching before the restack. Happy to share the harness setup (run-storm.sh) or the per-run forensics queries.

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