Skip to content

Slot event identity (SDK 3/3): number events by slot in the Local and Postgres Worlds - #3246

Draft
VaguelySerious wants to merge 20 commits into
peter/slot-ids-7-clientfrom
peter/slot-ids-8-worlds
Draft

Slot event identity (SDK 3/3): number events by slot in the Local and Postgres Worlds#3246
VaguelySerious wants to merge 20 commits into
peter/slot-ids-7-clientfrom
peter/slot-ids-8-worlds

Conversation

@VaguelySerious

Copy link
Copy Markdown
Member

Stacked on #3234. Review that first — this PR only makes sense once the client can claim a slot.

What

Slot identity is only useful if a World can keep it, so both first-party Worlds now allocate, honour, and defend dense per-run positions. evnt_…001 is a run's first event, evnt_…002 its second, with no gaps — so the highest number is the event count, and a reader can prove its copy of a log is complete.

Behaviour is opt-in per run via WORKFLOW_SLOT_IDENTITY, and a run keeps the scheme it was created with for life.

How

  • SPEC_VERSION_MAX_SUPPORTED separates the newest version a World can read from the version it stamps. Without the split, the flag that turns slot identity on for new runs would make every World reject the runs it had just created. Worlds opt into minting individually, through the specVersion they declare — mintedSpecVersion() is the one place that reads the flag.
  • Local World allocates under its storage lock and re-probes when it loses an exclusive write. Two storage instances sharing a directory keep independent books, so the write — not the book — decides who owns a position.
  • Postgres World makes the events primary key run-scoped ((run_id, id), migration 0018), because under slot identity evnt_…001 exists once per run. That key is then the authority: a unique violation means "this position is taken", and the writer re-probes and tries the next free one. Step ids get the same treatment for the same reason. The run leads both keys, so the existing run-scoped range scans stay a single index seek — which also makes the standalone run_id indexes redundant.
  • Re-probing every round, not max++, is what guarantees progress: each round at least one writer wins.
  • A claimed position that is already taken is a 409 (SlotConflictError) carrying the events the caller was missing, and nothing is materialized for it — a step row left behind by a losing attempt would make the caller's re-post trip its own orphan and read that as "a concurrent handler won the create".
  • Runtime: assertWorldSupportsRuntimeProtocol accepts a World declaring anything from SPEC_VERSION_CURRENT up to SPEC_VERSION_MAX_SUPPORTED, and a turbo invocation seeds its slot floor from the backgrounded run_started it never sees in its snapshot.

SPEC_VERSION_CURRENT stays 5 — nothing mints spec 6 unless the flag is set.

Testing

  • packages/world-postgres/test/slot-identity.test.ts (19 tests, Postgres testcontainer) and packages/world-local/src/storage/slot-identity.test.ts: dense numbering, both mode-pinning 400s, the conflict delta, and the no-orphan guarantee.
  • Contention at 2, 8 and 50 concurrent logless writers against real Postgres: all persist, positions are exactly dense, no duplicates.
  • A real run end to end on Postgres under the flag is spec-6 and numbered 1…6 with no holes.
  • Full suites green: world-postgres 181, world-local 522, world 98, core 1687.

Follow-ups

  • events.listByCorrelationId is not yet run-scoped; a correlation id is only unique within its run under slot identity. Needs a runId on ListEventsByCorrelationIdParams, so it is deliberately out of this PR.
  • world-vercel is the remaining World; it lands with the backend stack.

🤖 Generated with Claude Code

@changeset-bot

changeset-bot Bot commented Jul 31, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 7dd9863

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

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

@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 Jul 31, 2026 10:20pm
example-nextjs-workflow-webpack Ready Ready Preview Jul 31, 2026 10:20pm
example-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-astro-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-express-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-fastify-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-hono-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-nestjs-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-nitro-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-nuxt-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-sveltekit-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-tanstack-start-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workbench-vite-workflow Ready Ready Preview Jul 31, 2026 10:20pm
workflow-docs Ready Ready Preview, v0 Jul 31, 2026 10:20pm
workflow-swc-playground Ready Ready Preview Jul 31, 2026 10:20pm
workflow-tarballs Ready Ready Preview Jul 31, 2026 10:20pm
workflow-web Ready Ready Preview Jul 31, 2026 10:20pm

@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 (1422 failed)

astro (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

example (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

express (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

hono (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nextjs-turbopack (148 failed):

  • DurableAgent e2e core basic text response
  • DurableAgent e2e core single tool call
  • DurableAgent e2e core multiple sequential tool calls
  • DurableAgent e2e core tool error recovery
  • DurableAgent e2e onStepFinish fires constructor + stream callbacks in order with step data
  • DurableAgent e2e onFinish fires constructor + stream callbacks in order with event data
  • DurableAgent e2e provider tools provider tool identity preserved across step boundaries
  • DurableAgent e2e provider tools mixed provider and function tools
  • DurableAgent e2e instructions string instructions are passed to the model
  • DurableAgent e2e timeout completes within timeout
  • DurableAgent e2e experimental_onStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onStepStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onToolCallStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onToolCallFinish (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e prepareCall (GAP) completes but prepareCall is not applied (GAP)
  • DurableAgent e2e prepareStep on constructor agent-level prepareStep is called for each LLM step
  • DurableAgent e2e prepareStep on constructor stream-level prepareStep overrides constructor-level
  • DurableAgent e2e multimodal tool results passes through LanguageModelV3ToolResultOutput from tools
  • DurableAgent e2e tool approval (GAP) completes but needsApproval is not checked (GAP)
  • addTenWorkflow
  • addTenWorkflow
  • wellKnownAgentWorkflow (.well-known/agent)
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • importedStepOnlyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • plainModuleDoneHook resumed via plain API route (o2flow shape)
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nextjs-webpack (148 failed):

  • DurableAgent e2e core basic text response
  • DurableAgent e2e core single tool call
  • DurableAgent e2e core multiple sequential tool calls
  • DurableAgent e2e core tool error recovery
  • DurableAgent e2e onStepFinish fires constructor + stream callbacks in order with step data
  • DurableAgent e2e onFinish fires constructor + stream callbacks in order with event data
  • DurableAgent e2e provider tools provider tool identity preserved across step boundaries
  • DurableAgent e2e provider tools mixed provider and function tools
  • DurableAgent e2e instructions string instructions are passed to the model
  • DurableAgent e2e timeout completes within timeout
  • DurableAgent e2e experimental_onStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onStepStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onToolCallStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onToolCallFinish (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e prepareCall (GAP) completes but prepareCall is not applied (GAP)
  • DurableAgent e2e prepareStep on constructor agent-level prepareStep is called for each LLM step
  • DurableAgent e2e prepareStep on constructor stream-level prepareStep overrides constructor-level
  • DurableAgent e2e multimodal tool results passes through LanguageModelV3ToolResultOutput from tools
  • DurableAgent e2e tool approval (GAP) completes but needsApproval is not checked (GAP)
  • addTenWorkflow
  • addTenWorkflow
  • wellKnownAgentWorkflow (.well-known/agent)
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • importedStepOnlyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • plainModuleDoneHook resumed via plain API route (o2flow shape)
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nitro (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nuxt (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

sveltekit (142 failed):

  • DurableAgent e2e core basic text response
  • DurableAgent e2e core single tool call
  • DurableAgent e2e core multiple sequential tool calls
  • DurableAgent e2e core tool error recovery
  • DurableAgent e2e onStepFinish fires constructor + stream callbacks in order with step data
  • DurableAgent e2e onFinish fires constructor + stream callbacks in order with event data
  • DurableAgent e2e provider tools provider tool identity preserved across step boundaries
  • DurableAgent e2e provider tools mixed provider and function tools
  • DurableAgent e2e instructions string instructions are passed to the model
  • DurableAgent e2e timeout completes within timeout
  • DurableAgent e2e experimental_onStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onStepStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onToolCallStart (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e experimental_onToolCallFinish (GAP) completes but callbacks are not called (GAP)
  • DurableAgent e2e prepareCall (GAP) completes but prepareCall is not applied (GAP)
  • DurableAgent e2e prepareStep on constructor agent-level prepareStep is called for each LLM step
  • DurableAgent e2e prepareStep on constructor stream-level prepareStep overrides constructor-level
  • DurableAgent e2e multimodal tool results passes through LanguageModelV3ToolResultOutput from tools
  • DurableAgent e2e tool approval (GAP) completes but needsApproval is not checked (GAP)
  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

vite (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q | 🔍 observability
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit
📋 Other (246 failed)

e2e-vercel-prod-nest (123 failed):

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

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

  • addTenWorkflow
  • addTenWorkflow
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • readableStreamWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • parallelStepsThenWebhookWorkflow - no hook_conflict from same-tick replay race
  • sleepingWorkflow
  • parallelSleepWorkflow
  • sleepWinsRaceWorkflow
  • stepWinsRaceWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • outputStreamWorkflow no startIndex (reads all chunks)
  • outputStreamWorkflow positive startIndex (skips first chunk)
  • outputStreamWorkflow negative startIndex (reads from end)
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns correct index after stream completes
  • outputStreamWorkflow - getTailIndex and getChunks getTailIndex returns -1 before any chunks are written
  • outputStreamWorkflow - getTailIndex and getChunks getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions
  • utf8StreamWorkflow
  • writableForwardedFromWorkflowWorkflow
  • writableForwardedFromStepWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • error handling catchability step throw round-trips FatalError with cause chain to workflow catch
  • error handling catchability workflow throw round-trips FatalError + cause through run_failed event
  • error handling catchability workflow throw of a non-Error value round-trips verbatim as cause
  • error handling catchability step throw of a non-Error value preserves it as cause on the wrapping FatalError
  • error handling not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose()
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries
  • startFromWorkflow - calling start() directly inside a workflow function with hook communication
  • fibonacciWorkflow - recursive workflow composition via start()
  • health check (queue-based) - workflow endpoint responds to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • errorSubclassRoundTripWorkflow - first-class Error subclasses survive every serialization boundary
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • hookWithSleepFinalStepWorkflow - step only on final payload
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAlreadyAbortedWorkflow: pre-aborted signal seen by step
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortAfterCompletionWorkflow: abort after step completes is a no-op
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • AbortController abortExternalSignalWorkflow: signal passed as workflow input
  • AbortController abortExternalSignalInFlightWorkflow: external abort fires mid-flight, propagates to nested steps
  • AbortController abortAnyInWorkflowWorkflow: AbortSignal.any composes signals inside the workflow VM
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortSurvivesReplayWorkflow: controller state consistent across replay
  • AbortController abortThrowIfAbortedWorkflow: throwIfAborted causes FatalError, no retries
  • AbortController abortReasonTypesWorkflow: various abort reason types propagate correctly
  • AbortController abortFetchUncaughtWorkflow: uncaught fetch AbortError is FatalError, no retries
  • AbortController abortFetchInFlightWorkflow: aborting cancels an in-flight fetch
  • AbortController abortVoidSleepTimeoutWorkflow: documented void sleep().then(abort) pattern works
  • AbortController abortDeterministicBranchWorkflow: if-check takes same path on first-run and replay
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • AbortController abortHookOrderingWorkflow [listener-first-abort-first]: addEventListener → hook.then → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [listener-first-hook-first]: addEventListener → hook.then → resumeHook → abort()
  • AbortController abortHookOrderingWorkflow [hook-first-abort-first]: hook.then → addEventListener → abort() → resumeHook
  • AbortController abortHookOrderingWorkflow [hook-first-hook-first]: hook.then → addEventListener → resumeHook → abort()
  • importMetaUrlWorkflow - import.meta.url is available in step bundles
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577)
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41KYX47F540GWX9F58STW0900Q
  • getterStepWorkflow - getter functions with "use step" directive
  • distributedAbortController - manual abort triggers signal
  • distributedAbortController - TTL expiration triggers signal
  • distributedAbortController - reconnect to existing controller
  • 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
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit
vercel-multi-region (27 failed)

nextjs-turbopack (27 failed):

  • multi-region (world-vercel) explicit region: start({ region }) in the test process start({ region: iad1 }) mints a tagged run ID and executes there
  • multi-region (world-vercel) explicit region: start({ region }) in the test process start({ region: sfo1 }) mints a tagged run ID and executes there
  • multi-region (world-vercel) explicit region: start({ region }) in the test process start({ region: fra1 }) mints a tagged run ID and executes there
  • multi-region (world-vercel) explicit region: start({ region }) in the test process concurrent starts across all regions stay isolated
  • multi-region (world-vercel) explicit region: start({ region }) in the test process every provisioned region executes and completes a tagged run
  • multi-region (world-vercel) cross-region stream visibility an sfo1 reader sees chunks of an IN-PROGRESS iad1 stream
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/iad1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/arn1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/bom1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/cdg1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/cle1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/cpt1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/dub1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/fra1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/gru1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/hkg1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/hnd1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/icn1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/kix1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/lhr1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/pdx1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/sfo1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/sin1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/syd1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) implicit region: region-pinned routes without a region option /api/e2e-region-implicit/yul1 mints a run tagged with its VERCEL_REGION
  • multi-region (world-vercel) hooks on non-iad1 runs hook created by a sfo1 run resolves by token and resumes the run
  • multi-region (world-vercel) hooks on non-iad1 runs hook created by a fra1 run resolves by token and resumes the run

E2E Test Summary

Summary
Passed Failed Skipped Total
❌ ▲ Vercel Production 33 1422 239 1694
✅ 💻 Local Development 1467 0 227 1694
✅ 📦 Local Production 1621 0 227 1848
✅ 🐘 Local Postgres 1621 0 227 1848
✅ 🪟 Windows 154 0 0 154
❌ 📋 Other 774 246 212 1232
❌ vercel-multi-region 0 27 0 27
Total 5670 1695 1132 8497
Details by Category

❌ ▲ Vercel Production

App Passed Failed Skipped
❌ astro 3 123 28
❌ example 3 123 28
❌ express 3 123 28
❌ fastify 3 123 28
❌ hono 3 123 28
❌ nextjs-turbopack 3 148 3
❌ nextjs-webpack 3 148 3
❌ nitro 3 123 28
❌ nuxt 3 123 28
❌ sveltekit 3 142 9
❌ vite 3 123 28

✅ 💻 Local Development

App Passed Failed Skipped
✅ astro-stable 128 0 26
✅ express-stable 128 0 26
✅ fastify-stable 128 0 26
✅ hono-stable 128 0 26
✅ nextjs-turbopack-canary 135 0 19
✅ nextjs-webpack-canary 135 0 19
✅ nextjs-webpack-stable 154 0 0
✅ nitro-stable 128 0 26
✅ nuxt-stable 128 0 26
✅ sveltekit-stable 147 0 7
✅ vite-stable 128 0 26

✅ 📦 Local Production

App Passed Failed Skipped
✅ astro-stable 128 0 26
✅ express-stable 128 0 26
✅ fastify-stable 128 0 26
✅ hono-stable 128 0 26
✅ nextjs-turbopack-canary 135 0 19
✅ nextjs-turbopack-stable 154 0 0
✅ nextjs-webpack-canary 135 0 19
✅ nextjs-webpack-stable 154 0 0
✅ nitro-stable 128 0 26
✅ nuxt-stable 128 0 26
✅ sveltekit-stable 147 0 7
✅ vite-stable 128 0 26

✅ 🐘 Local Postgres

App Passed Failed Skipped
✅ astro-stable 128 0 26
✅ express-stable 128 0 26
✅ fastify-stable 128 0 26
✅ hono-stable 128 0 26
✅ nextjs-turbopack-canary 135 0 19
✅ nextjs-turbopack-stable 154 0 0
✅ nextjs-webpack-canary 135 0 19
✅ nextjs-webpack-stable 154 0 0
✅ nitro-stable 128 0 26
✅ nuxt-stable 128 0 26
✅ sveltekit-stable 147 0 7
✅ vite-stable 128 0 26

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack 154 0 0

❌ 📋 Other

App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 128 0 26
✅ e2e-local-dev-tanstack-start- 128 0 26
✅ e2e-local-postgres-nest-stable 128 0 26
✅ e2e-local-postgres-tanstack-start- 128 0 26
✅ e2e-local-prod-nest-stable 128 0 26
✅ e2e-local-prod-tanstack-start- 128 0 26
❌ e2e-vercel-prod-nest 3 123 28
❌ e2e-vercel-prod-tanstack-start 3 123 28

❌ vercel-multi-region

App Passed Failed Skipped
❌ nextjs-turbopack 0 27 0

📋 View full workflow run

@VaguelySerious VaguelySerious added the event-log-race-repro Run the event log race reproduction job label Jul 31, 2026
@VaguelySerious VaguelySerious added event-log-race-repro Run the event log race reproduction job and removed event-log-race-repro Run the event log race reproduction job labels Jul 31, 2026
VaguelySerious and others added 3 commits July 31, 2026 03:36
…s its start

The synthetic `step_created` a lazy step start materializes was written with a
plain create-if-absent write, so losing its position surfaced as a duplicate-
entity error - which the runtime reads as "another handler owns this step" and
skips, leaving the step claimed but never run. It now takes the position the
same way every other event does, and a loss is reported as a slot conflict the
caller can merge and re-propose.
An optimistic start runs against a locally synthesized run row, so the
workflow start time this invocation reports comes from the client clock
while every later replay reads the persisted run. Sending that instant as
the run_started event's occurredAt lets a backend record it as the run's
startedAt, so the two agree instead of differing by the round-trip.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rt time

`createdAt` is stamped when a write begins, before its final slot is known, so
it disagrees with slot order in two ways: a writer that loses a slot re-proposes
above the winner while keeping its earlier stamp, and a caller that reserves a
range of slots for one flush commits them in whatever order the network returns.
Replay consumes the log in list order and never sorts, so listing by `createdAt`
hands it an order no execution produced.

Slot events now report one shared order time and let the existing event-id
tie-break do the ordering, matching the Postgres World's `orderBy(eventId)` and
the Vercel World's sort key. ULID runs keep their wall-clock order, which their
ids agree with anyway.
* returns. A ULID-numbered run keeps its wall-clock order, which its ids agree
* with anyway.
*/
const eventOrderTime = (event: { eventId: string; createdAt: Date }): number =>

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.

Suggested change
const eventOrderTime = (event: { eventId: string; createdAt: Date }): number =>
const eventOrderTime = <TEvent extends { eventId: string; createdAt: Date }>(
event: TEvent
): number =>

Non-generic eventOrderTime parameter type collapses the generic T of paginatedFileSystemQuery, causing a TypeScript build break across event-typed call sites in @workflow/world-local.

Fix on Vercel

VaguelySerious and others added 5 commits July 31, 2026 11:17
Two independent sources of `CorruptedEventLogError` on well-formed event
logs, both found by dumping the logs of runs that failed that way.

A hook delivery is ordered by when its event row commits, not by when the
payload arrived, so a delivery that races a disposal — arriving first,
committing second — lands after its own `hook_disposed` in the log. The
hook's consumer retired on the disposal, so nothing consumed that event on
any replay: a divergence that recurs identically every attempt and escalates
to a terminal error. The consumer now stays registered as a tombstone and
discards the late delivery, which is what `disposeHook` already assumed when
it settled every awaiter.

Separately, the unconsumed-event check gave the VM a flat 100ms of wall clock
to register the next event's consumer. Real logs routinely need more: a hook
payload fanning out into steps measures 254-717ms between the delivery and
the first `step_created` it causes. The check now re-arms while a delivery is
still in flight — the condition `scheduleWhenIdle` already polls — bounded by
`WORKFLOW_DEFERRED_CHECK_MAX_GRACE_MS` so an abandoned delivery cannot park
it forever.
Contiguous allocation is not the same thing as a gap-free published log: a
slot claimed by an operation that then fails for a reason of its own is never
filled, and once a later slot is published that gap is permanent. What the
scheme actually buys is explicit contention and a log that reads in write
order. Nothing consumed the proof, so this is a comment and docs correction.
…e waited for

Three diagnostic gaps that together made replay divergence unreadable:

- `composeLogLine` dropped `errorMessage` whenever the message did not already
  contain it, so a warn carrying an error alongside its own summary line logged
  the symptom and none of the diagnosis.
- An unconsumable event named only itself. It is almost always an event whose
  entity this replay never issued, so the pending invocation queue is what
  distinguishes "never issued" from "issued under another id".
- An inline step batch abandoned on a fenced claim logged neither which member
  was fenced nor how the others settled. The fence is per-write, so a batch can
  split: the rejected claim writes nothing while a sibling on a different slot
  commits.

Also read a failed run's error through `returnValue()` in the race-repro
harness — `runs.get` returns the raw serialized payload, so every corruption in
the report carried a code and no message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…atch

An inline step's step_started claim is fenced per-write under slot identity, so
a 409 only proves another writer took that write's number — routinely true,
since the backend allocates outside events from the same next-free pointer the
client reserves from. Abandoning the whole batch on it left the loser's events
landing seconds later, after a whole later phase, in an order no single replay
could consume.

stepClaimFence keeps a watermark-guarded run on its single shared fence (a 412
does mean the view is stale, and the batch is meant to fail as a unit) and
gives a slot-numbered run an in-place reclaim: merge the delta, reserve past
it, re-claim.

The reservation pointer is now absolute and only moves forward, so a merge
cannot hand the retrying writer a slot a sibling is still in flight on.
@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

The benchmark run for 7dd9863 failed. See the run logs for details.

commit 44b20a1 · Fri, 31 Jul 2026 21:45:46 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 235 (-77%) 💚 736 🔴 (-37%) 💚 950 🔴 (-24%) 💚 1540 🔴 (-1.3%) 30
TTFS stream 249 (-35%) 💚 712 🔴 (-40%) 💚 1342 🔴 (+7.9%) 1415 🔴 (-63%) 💚 30
TTFS hook + stream 371 (-30%) 💚 1015 🔴 (-32%) 💚 1254 🔴 (-20%) 💚 1801 🔴 (-2.1%) 30
STSO 1020 steps (inline) 174 (-15%) 530 (-6.2%) 593 (-11%) 936 (-8.2%) 1015
STSO 1020 steps (queue-hop) 1549 (-31%) 💚 2356 (-25%) 💚 229368 (+5424%) 🔻 229368 (+5424%) 🔻 4
WO 1020 steps 678758 (+33%) 🔻 678758 (+33%) 🔻 678758 (+33%) 🔻 678758 (+33%) 🔻 1
SL stream latency 115 (+2.7%) 394 🔴 (+96%) 🔻 443 🔴 (+54%) 🔻 947 🔴 (+34%) 🔻 30
SO stream overhead (text) 282 (+75%) 🔻 2047 🔴 (+425%) 🔻 2321 🔴 (+273%) 🔻 3873 🔴 (+39%) 🔻 30
SO stream overhead (structured) 207 (+18%) 🔻 794 🔴 (+89%) 🔻 1720 🔴 (+213%) 🔻 4481 🔴 (-93%) 💚 30
📜 Previous results (1)

a67b345

Fri, 31 Jul 2026 21:05:15 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 347 (-50%) 💚 1296 🔴 (+16%) 🔻 1332 🔴 (-1.9%) 2818 🔴 (+67%) 🔻 30
TTFS stream 1246 (+365%) 🔻 1295 🔴 (+17%) 🔻 1317 🔴 (+17%) 🔻 1610 🔴 (+37%) 🔻 30
TTFS hook + stream 1462 (+8.2%) 1530 🔴 (-1.4%) 1548 🔴 (-8.0%) 1598 🔴 (-59%) 💚 30
STSO 1020 steps (inline) 177 (-15%) 💚 464 (-17%) 💚 512 (-19%) 💚 651 (-38%) 💚 1016
STSO 1020 steps (queue-hop) 2094 (-16%) 💚 3456 (-1.9%) 3456 (-3.5%) 3456 (-3.5%) 3
WO 1020 steps 396192 (-21%) 💚 396192 (-21%) 💚 396192 (-21%) 💚 396192 (-21%) 💚 1
SL stream latency 81 (-30%) 💚 149 🔴 (-31%) 💚 154 🔴 (-38%) 💚 178 🔴 (-55%) 💚 30
SO stream overhead (text) 98 (-42%) 💚 152 (-50%) 💚 178 (-53%) 💚 320 (-100%) 💚 30
SO stream overhead (structured) 104 (-46%) 💚 144 (-69%) 💚 158 (-81%) 💚 189 (-100%) 💚 30
ℹ️ Metric definitions & methodology

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 · SL 50/60/125 · 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.

@github-actions

github-actions Bot commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Event Log Race Repro

No event-log regressions in the latest repro job. 1400 runs hit harness-side infra outcomes (hook-resume timing races / transport errors); these are reported but do not fail the job.

Run History

Metric 2026-07-31 20:16 UTC #1
logs / deploy
2026-07-31 20:34 UTC #1
logs / deploy
2026-07-31 20:35 UTC #1
logs
2026-07-31 20:40 UTC #1
logs / deploy
2026-07-31 20:43 UTC #1
logs / deploy
2026-07-31 21:17 UTC #1
logs / deploy
2026-07-31 22:10 UTC #1
logs / deploy
2026-07-31 22:20 UTC #1
logs / deploy
Result 34/99 regressions — partial (99 of 1400 planned) 162/532 regressions (+2 infra) — partial (532 of 1400 planned) missing result file 45/105 regressions — partial (105 of 1400 planned) 8/8 regressions — partial (8 of 1400 planned) 179/835 regressions — partial (835 of 1400 planned) 177/1400 regressions (+1 infra) no regressions (+1400 infra)
Total 99 532 0 105 8 835 1400 1400
completed 65 368 0 60 0 656 1222 0
CORRUPTED_EVENT_LOG 34 162 0 45 8 172 174 0
USER_ERROR 0 0 0 0 0 0 0 0
RUNTIME_ERROR 0 0 0 0 0 0 0 0
stuck 0 0 0 0 0 7 3 0
other 0 0 0 0 0 0 0 0
infra 0 2 0 0 0 0 1 1400
Config 99 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8 532 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8 105 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8 8 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8 835 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8 1400 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8 1400 runs / step-storm 600, hook-storm 600, hook-sleep 200 / c40 / 6x8
Timing watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms watchdog 2500ms / step 2200±250ms / stagger 400ms / poke 750ms / timeout 240000ms

Latest Scenario Breakdown

Scenario Total completed CORRUPTED_EVENT_LOG USER_ERROR RUNTIME_ERROR stuck other infra
step-storm 600 0 0 0 0 0 0 600
hook-storm 600 0 0 0 0 0 0 600
hook-sleep 200 0 0 0 0 0 0 200

Latest Non-Completed Runs

Scenario Attempt Outcome Status Error code Run
step-storm 11 infra HARNESS_ERROR
step-storm 4 infra HARNESS_ERROR
step-storm 6 infra HARNESS_ERROR
step-storm 9 infra HARNESS_ERROR
step-storm 2 infra HARNESS_ERROR
step-storm 8 infra HARNESS_ERROR
step-storm 1 infra HARNESS_ERROR
step-storm 12 infra HARNESS_ERROR
step-storm 5 infra HARNESS_ERROR
step-storm 15 infra HARNESS_ERROR
step-storm 14 infra HARNESS_ERROR
step-storm 3 infra HARNESS_ERROR
step-storm 10 infra HARNESS_ERROR
step-storm 16 infra HARNESS_ERROR
step-storm 13 infra HARNESS_ERROR
step-storm 22 infra HARNESS_ERROR
step-storm 17 infra HARNESS_ERROR
step-storm 30 infra HARNESS_ERROR
step-storm 21 infra HARNESS_ERROR
step-storm 20 infra HARNESS_ERROR

Showing 20 of 1400 non-completed runs.

The event-log-race-repro-results artifact carries a window of the committed log around the divergent event, for a sample of the corruptions.

VaguelySerious and others added 5 commits July 31, 2026 13:35
A slot names a position in the replay order, so allocation has to hand out a
position no published event sits above. Handing out the lowest free position
instead let a late `step_completed` drop into a hole beneath its own
`step_created`/`step_started`, and every replay of that run then met a
completion for a step it had not started.

The book now keeps a monotonic ceiling: a reservation goes above every position
the book has ever seen, and releasing one does not lower it. `run_created` takes
the first slot outright rather than allocating it, since a `run_started` racing
it can already have moved the book past that position.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…event

A divergence is a disagreement between the order the log records and the
order a replay reconstructs it in, so the log's own ordering is the only
evidence that separates the candidate causes. The runs live on an ephemeral
preview deployment, so the window has to be read while the job is still
running.

Sampled (6 runs) and kept out of the sticky comment, which has a size limit;
the results artifact carries them.
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