Skip to content

Slot event identity (SDK 2/4): claim event slots client-side and reclaim on conflict - #3234

Closed
VaguelySerious wants to merge 6 commits into
peter/slot-event-idsfrom
peter/slot-ids-7-client
Closed

Slot event identity (SDK 2/4): claim event slots client-side and reclaim on conflict#3234
VaguelySerious wants to merge 6 commits into
peter/slot-event-idsfrom
peter/slot-ids-7-client

Conversation

@VaguelySerious

@VaguelySerious VaguelySerious commented Jul 30, 2026

Copy link
Copy Markdown
Member

Stacked on #3228. Second of four SDK PRs for slot-based event identity; the paired world-vercel backend changes are already deployed on their own stack.

What this does

On a run whose spec version numbers events by slot, the runtime names each event's own id — evnt_ plus the zero-padded slot — which is its claim on that position in the log. The backend inserts the id under a uniqueness constraint, so a SlotConflictError (409) proves another writer got there first and, with it, that this replay ran against an event log missing at least one event.

The reply to a lost slot is never "send it again": that would lose the same slot again. Each attempt merges the events it was missing — inline off the rejection body, topped up from the backend when the delta was truncated — and claims a fresh slot past them.

Reserving contiguously

Claims come off the loaded log contiguously (maxSlot + ++reserved) rather than all at maxSlot + 1. A suspension flushes its operations concurrently, so with a naive maxSlot + 1 every operation in a flush would propose the same slot and all but one would conflict — on every single flush. Operations are built in deterministic replay order, so the slot each one draws is replay-stable, and the fan-out costs no extra round-trips.

maxSlot is maintained by scanning merged events rather than reading the array's last element: events are appended without sorting, so after a mid-flight reload the last element is not the max.

One fence per run, two loops

withEventCreateFence picks whichever fence the run uses — its event slot when it numbers events by slot, the stateUpdatedAt watermark otherwise. The two retry loops stay separate rather than being folded together: they differ in what a rejection proves and in what the client does about it, and both are live at once while runs on the older numbering drain, which is what keeps 409s and 412s separately countable during a rollout.

Creates that deliberately do not retry in place — run_completed, the inline step_started claims — take a bare fence from eventCreateFenceFor and let a rejection escape to a fresh replay. That is not a giving-up path: merged events can change what the workflow body decides, and only a replay from the top can act on them.

stateUpdatedAtForCreate now takes the run's mode explicitly instead of inferring it. Inference would produce a wrong value rather than none: a padded slot body is valid Crockford base32, so decoding it yields epoch 0 rather than failing, and the client would claim a snapshot older than every event in the log.

Notes

  • Nothing here changes behavior for existing runs. SPEC_VERSION_CURRENT is still 5, so no run is stamped with slot identity yet — that happens in the third SDK PR, behind a flag.
  • The slot-conflict delta arrives as raw CBOR, so world-vercel normalizes its dates into the same Event shape every other read path produces, keeping SlotConflictError.events mean the same thing for every World that raises it.
  • A slot conflict is classified non-retryable in the transport retry layer, alongside EntityConflictError.

Docs

Page Preview
SlotConflictError /v5/docs/api-reference/workflow-errors/slot-conflict-error

(Preview base URL from the workflow-docs row of the vercel[bot] comment once it lands.)

🤖 Generated with Claude Code


Stack: #3228#3234#3246#3247

Paired backend stack (world-vercel side): 6 PRs, all rebased on main and stacked; WORKFLOW_SERVER_URL_OVERRIDE points at the top of it and must be reverted before merge.

On a run that numbers its events by slot, the runtime names each event's
own id, which is its claim on that position in the log. The backend
inserts the id conditionally, so a 409 proves another writer got there
first and that this replay ran against a log missing at least one event.

Claims are reserved contiguously off the loaded log rather than all at
maxSlot + 1: a suspension flushes its operations concurrently, so without
reservation every operation in a flush would propose the same slot and
all but one would conflict, on every flush. Operations are built in
deterministic replay order, so each one's slot is replay-stable.

`withEventCreateFence` picks the run's fence: the event slot for a
slot-numbered run, the `stateUpdatedAt` watermark otherwise. The two
retry loops stay separate — they differ in what a rejection proves and in
what the client does about it, and both are live at once while runs on the
older numbering drain, which is what keeps 409s and 412s separately
countable during a rollout.

Creates that must not retry in place (`run_completed`, the inline
`step_started` claims) take a bare fence from `eventCreateFenceFor`, so a
rejection escapes to a fresh replay: merged events can change what the
workflow body decides, and only a replay from the top can act on them.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@changeset-bot

changeset-bot Bot commented Jul 30, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 70c8871

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

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

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

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

@vercel

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

@github-actions

github-actions Bot commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (451 failed)

astro (32 failed):

  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability 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 run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ1R35740GG90KNBDHNYRR9B | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ1R50Y00GZFQ7DK0W83D4ZP | 🔍 observability

example (33 failed):

  • promiseRaceStressTestWorkflow | wrun_41KZ1QZ0680GS251RMGEB94KWC | 🔍 observability
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling 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 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ1R1X2E0GQP7SM6CXYTJ4EZ | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ1R58JF0GGX43EXHP6J7QP2 | 🔍 observability

express (36 failed):

  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ1R5Q2Y0GHZMYGXMXYDTGYZ | 🔍 observability

fastify (39 failed):

  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior 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 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ1R4B9V0GZ4XTYB55MVWK33 | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ1R4G1F0GQPRASX9VVKM7K6 | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ1R4J2C0GS7G9T7JHD9GSZ2 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ1R4PSK0GQNPXSMB4TGZ43G | 🔍 observability
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps

hono (45 failed):

  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ1R1X2E0GQP7SM6CXYTJ4EZ | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ1R35740GG90KNBDHNYRR9B | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM | 🔍 observability
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ1R4J2C0GS7G9T7JHD9GSZ2 | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ1R50Y00GZFQ7DK0W83D4ZP | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ1R58JF0GGX43EXHP6J7QP2 | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ1R5Q2Y0GHZMYGXMXYDTGYZ | 🔍 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 abortViaHookWorkflow: external hook triggers abort on in-flight step

nextjs-turbopack (49 failed):

  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_41KZ1QXX9N0GRG87XR0MN0CD0Q | 🔍 observability
  • utf8StreamWorkflow | wrun_41KZ1QY95R0GX0PKEFE4W3WFTY | 🔍 observability
  • writableForwardedFromWorkflowWorkflow | wrun_41KZ1QYGEX0GQWTS53XNPCF5GX | 🔍 observability
  • writableForwardedFromStepWorkflow | wrun_41KZ1QYQ8A0GG7M4KDN88EC253 | 🔍 observability
  • fetchWorkflow | wrun_41KZ1QYY6B0GRJDVHTXGRG0MK5 | 🔍 observability
  • promiseRaceStressTestWorkflow | wrun_41KZ1QZ0680GS251RMGEB94KWC | 🔍 observability
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ1R1X2E0GQP7SM6CXYTJ4EZ | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ1R4B9V0GZ4XTYB55MVWK33 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ1R4PSK0GQNPXSMB4TGZ43G | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ1R4V3C0GVCKJ90BFH08MFQ | 🔍 observability
  • pages router sleepingWorkflow via pages router

nextjs-webpack (39 failed):

  • writableForwardedFromStepWorkflow | wrun_41KZ1QYQ8A0GG7M4KDN88EC253 | 🔍 observability
  • promiseRaceStressTestWorkflow | wrun_41KZ1QZ0680GS251RMGEB94KWC | 🔍 observability
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • 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 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ1R35740GG90KNBDHNYRR9B | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
  • pages router sleepingWorkflow via pages router

nitro (57 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 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ1R35740GG90KNBDHNYRR9B | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ1R4G1F0GQPRASX9VVKM7K6 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ1R4PSK0GQNPXSMB4TGZ43G | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ1R4V3C0GVCKJ90BFH08MFQ | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ1R50Y00GZFQ7DK0W83D4ZP | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ1R5E9M0GM699JNC9VNBECB | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ1R5Q2Y0GHZMYGXMXYDTGYZ | 🔍 observability
  • 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 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 abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KZ1R9Y1Q0GVM26EJ9F40TCCS | 🔍 observability

nuxt (42 failed):

  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors 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 StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ1R4B9V0GZ4XTYB55MVWK33 | 🔍 observability
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ1R4G1F0GQPRASX9VVKM7K6 | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ1R58JF0GGX43EXHP6J7QP2 | 🔍 observability
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires

sveltekit (47 failed):

  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ | 🔍 observability
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1 | 🔍 observability
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY | 🔍 observability
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN | 🔍 observability
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ1R4B9V0GZ4XTYB55MVWK33 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41KZ1R4PSK0GQNPXSMB4TGZ43G | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ1R4V3C0GVCKJ90BFH08MFQ | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41KZ1R50Y00GZFQ7DK0W83D4ZP | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ1R58JF0GGX43EXHP6J7QP2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ1R5E9M0GM699JNC9VNBECB | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ1R5Q2Y0GHZMYGXMXYDTGYZ | 🔍 observability
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input

vite (32 failed):

  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior 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 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4 | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ1R1X2E0GQP7SM6CXYTJ4EZ | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE | 🔍 observability
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0 | 🔍 observability
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23 | 🔍 observability
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q | 🔍 observability
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ1R35740GG90KNBDHNYRR9B | 🔍 observability
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4 | 🔍 observability
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE | 🔍 observability
📋 Other (101 failed)

e2e-vercel-prod-nest (71 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41KZ1R15NW0GKTWQHRAB9R7YJ4
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41KZ1R1G870GTJYAZ5JSBKNMMS
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41KZ1R1X2E0GQP7SM6CXYTJ4EZ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41KZ1R2DTG0GHDSTQJTXNDTTGR
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_41KZ1R2SXV0GQ0YB2WXW655XA1
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication | wrun_41KZ1R3TKC0GQD1JRSMAGCSV23
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_41KZ1R35740GG90KNBDHNYRR9B
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_41KZ1R3A6K0GRMJB53K00KJNDY
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_41KZ1R3FCH0GP31J94FZGAWQZN
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_41KZ1R3RR40GMV71BNASYM5ST4
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_41KZ1R3XTZ0GTRKGEKKTXN42JM
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_41KZ1R42DA0GQPE5P8G4BD5HZE
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_41KZ1R4B9V0GZ4XTYB55MVWK33
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary | wrun_41KZ1R4G1F0GQPRASX9VVKM7K6
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_41KZ1R4J2C0GS7G9T7JHD9GSZ2
  • cancelRun - cancelling a running workflow | wrun_41KZ1R4PSK0GQNPXSMB4TGZ43G
  • cancelRun via CLI - cancelling a running workflow | wrun_41KZ1R4V3C0GVCKJ90BFH08MFQ
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41KZ1R58JF0GGX43EXHP6J7QP2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41KZ1R5E9M0GM699JNC9VNBECB
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41KZ1R5Q2Y0GHZMYGXMXYDTGYZ
  • 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 abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • 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()
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_41KZ1R9W2B0GXPM388HS2VV5SP
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KZ1R9Y1Q0GVM26EJ9F40TCCS
  • resilient resume: hookWorkflow receives payload when hook_received returns 500 | wrun_41KZ1R9ZZ40GRGW657J84HCSH0
  • getterStepWorkflow - getter functions with "use step" directive | wrun_41KZ1RA7J50GSXFSHK04F5BS0A
  • distributedAbortController - manual abort triggers signal | wrun_41KZ1RACQP0GS2SWKHNCW51J8A
  • 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 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

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

  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw 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 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_41KZ1R0ZPF0GKKPCEB3NBZCCPW
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KZ1R13KH0GYVHHNGF26THRRV
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41KZ1R1P590GVAWF2V0JD6CYMW
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41KZ1R1DA20GJ48T7A1YB6YH6V
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41KZ1R1WZ80GG57VRP08D16PE8
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41KZ1R1Y7H0GZ2ZXC580MPVBTW
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41KZ1R1Z3S0GKJQ0MNBJX64RRK
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41KZ1R20FF0GS43XESV2C9SWFZ
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41KZ1R23W10GZ7E57ATP6T4CMV
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41KZ1R2AMX0GP1VYAWTZF20X3V
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_41KZ1R2JJP0GXXBHWNA49BHNHJ
  • closureVariableWorkflow - nested step functions with closure variables | wrun_41KZ1R2YKX0GV3FZERE3N3H5EN
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41KZ1R383F0GTEPY2Z7FBF58YE
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_41KZ1R3F8S0GHD3HT02J1JPHN0
  • fibonacciWorkflow - recursive workflow composition via start() | wrun_41KZ1R2HDN0GS380SR3SMWGZ0Q
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_41KZ1R3M150GMJ1F7YCVZRECWR

E2E Test Summary

Summary
Passed Failed Skipped Total
❌ ▲ Vercel Production 1015 451 239 1705
✅ 💻 Local Development 1497 0 208 1705
✅ 📦 Local Production 1633 0 227 1860
✅ 🐘 Local Postgres 1633 0 227 1860
✅ 🪟 Windows 155 0 0 155
❌ 📋 Other 927 101 212 1240
✅ vercel-multi-region 27 0 0 27
Total 6887 552 1113 8552
Details by Category

❌ ▲ Vercel Production

App Passed Failed Skipped
❌ astro 95 32 28
❌ example 94 33 28
❌ express 91 36 28
❌ fastify 88 39 28
❌ hono 82 45 28
❌ nextjs-turbopack 103 49 3
❌ nextjs-webpack 113 39 3
❌ nitro 70 57 28
❌ nuxt 85 42 28
❌ sveltekit 99 47 9
❌ vite 95 32 28

✅ 💻 Local Development

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

✅ 📦 Local Production

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

✅ 🐘 Local Postgres

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

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack 155 0 0

❌ 📋 Other

App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 129 0 26
✅ e2e-local-dev-tanstack-start- 129 0 26
✅ e2e-local-postgres-nest-stable 129 0 26
✅ e2e-local-postgres-tanstack-start- 129 0 26
✅ e2e-local-prod-nest-stable 129 0 26
✅ e2e-local-prod-tanstack-start- 129 0 26
❌ e2e-vercel-prod-nest 56 71 28
❌ e2e-vercel-prod-tanstack-start 97 30 28

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

📋 View full workflow run

A lazy inline step start publishes two events: the World also writes the
`step_created` the start deferred. That second event takes the slot
immediately below the claim, so the claim has to reserve it — the batch
hands out slots synchronously, before any of them land, and a second
event numbered off the log as the backend sees it lands on the slot the
next start in the batch is holding and costs that start its claim.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Main's in-process replay restart (#3145) replaced the per-create retry
loops the slot work was built on. Collapse the slot path onto the same
machinery rather than resurrect the old scaffolding:

- `isStaleWriteRejection` classifies both rejections that prove a replay
  read an incomplete log — 412 for the event-log watermark, 409 for a
  lost slot claim — and drives one restart path for both.
- `preconditionEventDelta` reads the delta off either error, refusing a
  truncated slot-conflict delta so a restart never resumes on a log that
  is still missing events.
- `eventCreateFenceFor` returns whichever fence the run's numbering calls
  for, so every create site carries one fence instead of two.
- The v4 error decoder is CBOR-aware for both the 409 slot conflict and
  the 412 precondition details.

@vercel vercel Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Additional Suggestion:

settlePhase only prefers a 412 PreconditionFailedError when multiple suspension ops reject, so a 409 SlotConflictError can be masked by a co-occurring FatalError, spuriously failing a recoverable slot-numbered run.

Fix on Vercel

@VaguelySerious

Copy link
Copy Markdown
Member Author

(AI) Superseded by #3305, which combines this stack into a single PR. The correlation-id renumbering that this stack carried is dropped: it was separable from slot event identity, and it dragged in prerequisites of its own (run-scoped queue idempotency keys, run-scoped step keys). Correlation ids stay ULIDs.

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.

1 participant