Skip to content

fix(core): start() with an explicit deploymentId outside a deployment - #4408

Merged
pranaygp merged 2 commits into
mainfrom
pgp/start-explicit-deployment-without-current
Sep 25, 2026
Merged

pranaygp merged 2 commits into
mainfrom
pgp/start-explicit-deployment-without-current

Conversation

@pranaygp

Copy link
Copy Markdown
Contributor

Problem

start() called world.getDeploymentId() unconditionally, even when opts.deploymentId was supplied. The Vercel world's getDeploymentId() throws missingDeploymentIdMessage('Starting a workflow run') when VERCEL_DEPLOYMENT_ID is unset (added in 49276f2 / #3144), so recreateRunFromExisting(world, runId, { deploymentId }) (Replay Run) failed from any process that is not itself a Vercel deployment: local workflow web pointed at production, or recovery scripts. Found during INC-8092 recovery and worked around there with a placeholder VERCEL_DEPLOYMENT_ID.

Fix

  • No deploymentId, or 'latest': unchanged. The current deployment picks the default target and resolves 'latest', so a world that cannot report one still fails the start.
  • Concrete deploymentId: the target is used as given. If getDeploymentId() throws, the start is treated as cross-deployment (capability probe when the world has a probe channel, otherwise the universally readable formats) instead of failing. When the current deployment is available, behaviour is identical to before.

The 'latest' resolution moved into the first branch so currentDeploymentId can be undefined without casts.

Tests

New start › without a current deployment block, using a world whose getDeploymentId rejects:

  • explicit deploymentId starts the run; run_created and the queue message carry the target id
  • explicit deploymentId probes the target (health check sent to it) rather than taking the same-deployment shortcut
  • no deploymentId still rejects before writing any event
  • 'latest' still rejects without calling resolveLatestDeploymentId

The first two fail without the fix. recreateRunFromExisting always forwards the source run's deploymentId, so the explicit-id start() path is what it exercises (runs.test.ts stubs start).

🤖 Generated with Claude Code

recreateRunFromExisting (Replay Run) from a process that is not itself a
deployment failed because start() called world.getDeploymentId()
unconditionally. With a concrete target, an unavailable current deployment
now means a cross-deployment start instead of an error.

Co-Authored-By: Claude <noreply@anthropic.com>
@pranaygp
pranaygp requested a review from a team as a code owner September 25, 2026 03:53
Copilot AI lite review requested due to automatic review settings September 25, 2026 03:53
@changeset-bot

changeset-bot Bot commented Sep 25, 2026 •

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 736a2d3

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

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

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

@vercel

vercel Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

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

Project Deployment Actions Updated
example-nextjs-workflow-turbopack Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
example-nextjs-workflow-webpack Building Building Preview, v0 Sep 25, 2026 6:56pm UTC
example-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-astro-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-express-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-fastify-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-hono-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-nestjs-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-nitro-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-nuxt-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-python-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-sveltekit-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-tanstack-start-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workbench-vite-workflow Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workflow-docs Building Building Preview, v0 Sep 25, 2026 6:56pm UTC
workflow-swc-playground Building Building Preview, v0 Sep 25, 2026 6:56pm UTC
workflow-tarballs Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC
workflow-web Ready Ready Preview, v0 Sep 25, 2026 6:56pm UTC

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit 736a2d3 · Fri, 25 Sep 2026 19:21:35 GMT · run logs

Backend: vercel · app: nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 2376 (+430%) 🔻 2662 🔴 (+52%) 🔻 2769 🔴 (+52%) 🔻 3101 🔴 (+29%) 🔻 30
TTFS stream 444 (-73%) 💚 2485 🔴 (+44%) 🔻 2552 🔴 (+45%) 🔻 2769 🔴 (+56%) 🔻 30
TTFS hook + stream 2632 (+32%) 🔻 2783 🔴 (+35%) 🔻 2825 🔴 (+33%) 🔻 2935 🔴 (+33%) 🔻 30
Fan-out TTFS Promise.all(100 steps) 668 (+42%) 🔻 1014 (+29%) 🔻 3069 (+239%) 🔻 3510 (+68%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 2114 (-13%) 3868 (-22%) 💚 4705 (-23%) 💚 11871 (+27%) 🔻 10
STSO 1020 steps (inline) 120 (-7.0%) 148 (-2.0%) 165 (-2.4%) 212 (-55%) 💚 1019
WO 1020 steps 149086 (-7.3%) 149086 (-7.3%) 149086 (-7.3%) 149086 (-7.3%) 1
CRTT first chunk (pooled) 77 (+31%) 🔻 133 (+37%) 🔻 164 (+15%) 240 (-34%) 💚 28

Streams

Scenario CRTT 1st p75 p90 p99 CDV max iters
paced control (100/s, 60B) 97.5 (+18%) 153 (+24%) 194 (+7%) 311 (-6%) 132 (+2%) 10
size sweep (100/s, 160B-12KB) 120 (+41%) 162 (+37%) 245 (+63%) 424 (+4%) 121 (+35%) 10
replay gateway-gpt-5.4-nano-2000t (1x) 138 (+106%) 143 (±0%) 166 (-17%) 251 (-29%) 183 (-14%) 3
replay eve-gpt-5.6-sol-2000t (1x) 180 (+51%) 1410 (+1010%) 3688 (+1984%) 4837 (+510%) 2522 (+567%) 2
replay eve-gpt-5.6-sol-2000t (2x) 113 (+30%) 172 (+12%) 213 (±0%) 341 (-22%) 182 (-33%) 3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 160643ms → this run 148684ms (Δ -11959ms, -7%)

  100-150 ms  ██████████████████████░┃  main 742  this 801   +59
  150-200 ms  █████┃█                   main 249  this 198   -51
  200-250 ms  ┃                         main  14  this  15    +1
  250-300 ms  ┃                         main   2  this   2    +0
  300-350 ms  ┃                         main   1  this   3    +2
  450-500 ms  ┃                         main   1  this   0    -1
  800-850 ms  ┃                         main   1  this   0    -1
  850-900 ms  ┃                         main   1  this   0    -1
  900-950 ms  ┃                         main   1  this   0    -1
 950-1000 ms  ┃                         main   1  this   0    -1
1000-1050 ms  ┃                         main   1  this   0    -1
1100-1150 ms  ┃                         main   1  this   0    -1
1150-1200 ms  ┃                         main   1  this   0    -1
1250-1300 ms  ┃                         main   1  this   0    -1
1400-1450 ms  ┃                         main   1  this   0    -1
1450-1500 ms  ┃                         main   1  this   0    -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant  RTT 1ms→5s+              avg         p50            p90           p99     n
control  ······▃█▁····   129.8 (+18%)  126 (+21%)      194 (+7%)     311 (-6%)  3000
sweep    ······▂█▁····   138.8 (+34%)  130 (+31%)     245 (+63%)     424 (+4%)  3000
gw 1x    ·····▁▃█▁····     123 (+10%)  120 (+18%)     166 (-17%)    251 (-29%)  5295
eve 1x   ·····▁▃█▁▁▁▂▁  553.4 (+376%)  132 (+32%)  3688 (+1984%)  4837 (+510%)  5186
eve 2x   ·····▁▂█▂····    145.5 (+9%)  139 (+15%)      213 (±0%)    341 (-22%)  7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control  ▂▂█▁▂▁▄▄▄▁  122–150ms
sweep    █▁▂▆▁▅▃▂▆▂  127–159ms
gw 1x    ▂█▅▅▆▃▂▄▃▁  120–127ms
eve 1x   ▁▁▁▁▁▁▆▆█▆  120–1524ms
eve 2x   ▅▃▃▂▂▃▆█▇▁  128–168ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep  ▆▄▁▅▆▅█  137–140ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control  ▁▃█▅▃▅▅▆▅▂  37–50ms
sweep    ▁▇▃▇▇█▆▂█▂  47–64ms
gw 1x    ▄█▅▁▆▆▇▆▄▅  33–40ms
eve 1x   ▂▁▁▂▁▁█▇█▂  22–66ms
eve 2x   █▅▂▄▅▄▄▁▅▆  18–30ms
📜 Previous results (1)

29e03f3

Fri, 25 Sep 2026 04:19:22 GMT · run logs

vercel / nextjs-turbopack

Metric Scenario Best (ms) P75 (ms) P90 (ms) P99 (ms) Samples
TTFS step 197 (-86%) 💚 2200 🔴 (+21%) 🔻 2300 🔴 (+23%) 🔻 2724 🔴 (+37%) 🔻 30
TTFS stream 188 (-16%) 💚 2213 🔴 (+6.6%) 2276 🔴 (+7.0%) 2662 🔴 (+15%) 🔻 30
TTFS hook + stream 532 (+43%) 🔻 2948 🔴 (+47%) 🔻 3022 🔴 (+44%) 🔻 3087 🔴 (+33%) 🔻 30
Fan-out TTFS Promise.all(100 steps) 456 (-8.8%) 686 (-7.7%) 819 (+9.3%) 3267 (+52%) 🔻 10
Fan-out TTLS Promise.all(100 steps) 1560 (-26%) 💚 3585 (-29%) 💚 5657 (-4.2%) 6916 (-13%) 10
STSO 1020 steps (inline) 124 (+4.2%) 146 (-7.6%) 164 (-8.9%) 287 (-20%) 💚 1019
WO 1020 steps 149841 (-4.5%) 149841 (-4.5%) 149841 (-4.5%) 149841 (-4.5%) 1
CRTT first chunk (pooled) 85 (+12%) 118 (±0%) 144 (+1.4%) 166 (-29%) 💚 28

Streams

Scenario CRTT 1st p75 p90 p99 CDV max iters
paced control (100/s, 60B) 106 (-1%) 151 (-30%) 197 (-52%) 305 (-74%) 135 (-48%) 10
size sweep (100/s, 160B-12KB) 110 (-1%) 154 (-19%) 200 (-22%) 493 (+16%) 148 (-6%) 10
replay gateway-gpt-5.4-nano-2000t (1x) 118 (+4%) 138 (-27%) 160 (-37%) 268 (-56%) 200 (-39%) 3
replay eve-gpt-5.6-sol-2000t (1x) 111 (-5%) 150 (-17%) 182 (-21%) 346 (-13%) 239 (-34%) 2
replay eve-gpt-5.6-sol-2000t (2x) 89 (-23%) 183 (-23%) 251 (-19%) 444 (-10%) 267 (-28%) 3
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

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

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000t eaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t 6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

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

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

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

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

❌ Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (62 failed)

python-node (62 failed):

  • promiseAllWorkflow | wrun_41M3CYVPG60GGGQ1Q4GH1SVVYR | 🔍 observability
  • promiseRaceWorkflow | wrun_41M3CYVPG60GGGQ1Q4GH1SVVYS | 🔍 observability
  • promiseAnyWorkflow | wrun_41M3CYVPG60GGGQ1Q4GH1SVVYT | 🔍 observability
  • retainedInterleavingWorkflow | wrun_41M3CYVZ1N0GZXFJM73750QYXM | 🔍 observability
  • hookWorkflow | wrun_41M3CYW3MS0GH3SF82DFP9XDJ2 | 🔍 observability
  • hookWorkflow is not resumable via public webhook endpoint | wrun_41M3CYW45J0GSP1TX5KC2JJE9F | 🔍 observability
  • sleepingWorkflow | wrun_41M3CYWBYK0GQVCMGJGKZ960DD | 🔍 observability
  • parallelSleepWorkflow | wrun_41M3CYWDRH0GT9F766JFG7YQ5K | 🔍 observability
  • sleepWinsRaceWorkflow | wrun_41M3CYWDSC0GNBSJY2GTKGYFK5 | 🔍 observability
  • stepWinsRaceWorkflow | wrun_41M3CYWKET0GYP67WW49BC4RNX | 🔍 observability
  • nullByteWorkflow | wrun_41M3CYWM3N0GPC0ESC75K5KD17 | 🔍 observability
  • 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 getChunks returns same content as reading the stream
  • outputStreamInsideStepWorkflow - getWritable() called inside step functions | wrun_41M3CYXA3A0GQGCVEX30VE4W95 | 🔍 observability
  • utf8StreamWorkflow | wrun_41M3CYXCDM0GWGFBJ1J2EKBX7K | 🔍 observability
  • writableForwardedFromWorkflowWorkflow | wrun_41M3CYXCJH0GRYVKQBST040K7A | 🔍 observability
  • writableForwardedFromStepWorkflow | wrun_41M3CYXCXP0GW3DX900EJGJTG3 | 🔍 observability
  • promiseRaceStressTestWorkflow | wrun_41M3CYXG170GSER93XK3QCHWW2 | 🔍 observability
  • 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 not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M3CYZ66G0GGJWBDDVX7VV43N | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M3CYZ0AY0GQHEK29AW9WDRQZ | 🔍 observability
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload | wrun_41M3CYZ31C0GG9XE3MF7G5KYWP | 🔍 observability
  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution | wrun_41M3CYZ4T40GTZBNN79ZGW1SP5 | 🔍 observability
  • 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution | wrun_41M3CYZ9YR0GWP14J0FKEFTXDF | 🔍 observability
  • hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps | wrun_41M3CYZARD0GXDHVEVBHFJ630Y | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M3CYZCNZ0GSDNV4EBJ8CE4N2 | 🔍 observability
  • hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data | wrun_41M3CZ03XC0GZDMTR2P402NFB7 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M3CYZSV80GK0NTSB810Z58FB | 🔍 observability
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook | wrun_41M3CYZW3C0GGMADJ5YQ8DQNM0 | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M3CZ0N550GXPWH284WKQTF6C | 🔍 observability
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_41M3CZ0R9G0GZRKKPTB3ADZJPV | 🔍 observability
  • hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() | wrun_41M3CZ0TXE0GTHMERSSR4GPSE1 | 🔍 observability
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_41M3CZ1FAB0GK611YW5AHWHBNB | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M3CZ2H570GTDQGW865KR1YY0 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M3CZ2KPW0GMVKJS8TSCGMJ5C | 🔍 observability
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_41M3CZ2P3F0GS9A1JQZ1YSDSHJ | 🔍 observability
  • hookWithSleepFinalStepWorkflow - step only on final payload | wrun_41M3CZ2PZS0GM1YQ6D0TWT5RT8 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M3CZ2S860GQDM867S94HKXC3 | 🔍 observability
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_41M3CZ2VK80GXQS31638ZSKJCV | 🔍 observability
  • AbortController abortTimeoutWorkflow: timeout cancels long-running step
  • AbortController abortParallelWorkflow: abort cancels all parallel steps
  • AbortController abortReasonWorkflow: abort reason preserved across boundaries
  • AbortController abortViaHookWorkflow: external hook triggers abort on in-flight step
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_41M3CZ3A7W0GN92ZC5ACDTKCT1 | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M3CZ3CC00GN57XWKZ2QWV3MZ | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

⚠️ Flaky E2E Tests (passed on retry)

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

  • 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution (nextjs-webpack · local-dev / local / node / stable)
  • a run can take over its own earlier hook (nextjs-webpack · local-dev / local / node / stable)
  • hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload (nextjs-webpack · local-dev / local / node / stable)
  • webhookWorkflow (fastify · vercel-prod / vercel / quickjs / production)

🛠 Infra Events (absorbed by the harness)

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

127 infra events
  • cold-start-warmup · suite warmup (python) · at 18:57:32Z · abandoned wrun_41M3CYREQ10GYEAYNEWJ5MXTYH · (+7 more)
  • run-pickup-stall · promiseAllWorkflow (python) · at 18:57:48Z · abandoned wrun_41M3CYW3T50GZQ7P0V3SMSCY2Q
  • run-pickup-stall · promiseRaceWorkflow (python) · at 18:57:49Z · abandoned wrun_41M3CYW3T50GZQ7P0V3SMSCY2R
  • run-pickup-stall · hookWorkflow (python) · at 18:57:49Z · abandoned wrun_41M3CYW3TA0GXDP6DSQ8RS7FMN
  • run-pickup-stall · retainedInterleavingWorkflow (python) · at 18:57:49Z · abandoned wrun_41M3CYW3T50GZQ7P0V3SMSCY2T
  • run-pickup-stall · promiseAnyWorkflow (python) · at 18:57:49Z · abandoned wrun_41M3CYW3T50GZQ7P0V3SMSCY2S
  • run-pickup-stall · hookWorkflow (python) · at 18:58:36Z · abandoned wrun_41M3CYXJDH0GSV5593AB19F80Z
  • run-pickup-stall · retainedInterleavingWorkflow (python) · at 18:58:36Z · abandoned wrun_41M3CYXJNV0GSY2F9HYZTDVCRF
  • run-pickup-stall · promiseRaceWorkflow (python) · at 18:58:49Z · abandoned wrun_41M3CYXZDY0GX5422BCZV3CHKK
  • run-pickup-stall · promiseAnyWorkflow (python) · at 18:58:50Z · abandoned wrun_41M3CYXZE30GZGCJ8X0590BD36
  • run-pickup-stall · promiseAllWorkflow (python) · at 18:58:50Z · abandoned wrun_41M3CYXZB40GKHDBV4K1N3NKW6
  • cold-start-warmup · suite warmup (tanstack-start) · at 18:59:12Z · abandoned wrun_01M3CYYPSEGQCSV9V04GJP0QSD
  • run-pickup-stall · hookWorkflow is not resumable via public webhook endpoint (python) · at 18:59:24Z · abandoned wrun_41M3CYZ0PP0GQSXR3M0AXQGJ2W
  • run-pickup-stall · sleepingWorkflow (python) · at 18:59:24Z · abandoned wrun_41M3CYZ1890GKDE5RR9D9PDKZJ
  • run-pickup-stall · parallelSleepWorkflow (python) · at 18:59:52Z · abandoned wrun_41M3CYZVG30GRVSG5BR10X8CWB
  • run-pickup-stall · sleepWinsRaceWorkflow (python) · at 18:59:53Z · abandoned wrun_41M3CYZVQD0GZEWF0TRKWWH1GB
  • run-pickup-stall · stepWinsRaceWorkflow (python) · at 18:59:53Z · abandoned wrun_41M3CYZVYN0GXWEZV5RGNKCQQA
  • run-pickup-stall · sleepingWorkflow (python) · at 19:01:21Z · abandoned wrun_41M3CZ1JGP0GS7SA30V46K7GB6
  • run-pickup-stall · hookWorkflow is not resumable via public webhook endpoint (python) · at 19:01:21Z · abandoned wrun_41M3CZ1J9Y0GQFD2WA3KYD0CF9
  • run-pickup-stall · sleepWinsRaceWorkflow (python) · at 19:01:27Z · abandoned wrun_41M3CZ2KKZ0GR8XPSC0MDX7RSP
  • run-pickup-stall · parallelSleepWorkflow (python) · at 19:01:28Z · abandoned wrun_41M3CZ2KCM0GMW0V56R9Z17Q5G
  • run-pickup-stall · stepWinsRaceWorkflow (python) · at 19:01:28Z · abandoned wrun_41M3CZ2KV40GJ67FQ0938J7C1C
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (nuxt) · at 19:01:28Z · abandoned wrun_01M3CZ2VPN45WX8H478KE75CFE
  • run-pickup-stall · nullByteWorkflow (python) · at 19:01:48Z · abandoned wrun_41M3CZ3DWK0GQTWP29RB4X2NT9
  • run-pickup-stall · no startIndex (reads all chunks) (python) · at 19:01:48Z · abandoned wrun_41M3CZ3E0V0GVVDR7WG9GQARW8
  • run-pickup-stall · positive startIndex (skips first chunk) (python) · at 19:02:21Z · abandoned wrun_41M3CZ4DZM0GNW6C4M6TBASXC4
  • run-pickup-stall · negative startIndex (reads from end) (python) · at 19:02:21Z · abandoned wrun_41M3CZ4E6Z0GQ9XYHVNHK11WPP
  • run-pickup-stall · getTailIndex returns correct index after stream completes (python) · at 19:02:24Z · abandoned wrun_41M3CZ4H3M0GWA4DRG70WAMMHY
  • run-pickup-stall · getTailIndex returns -1 before any chunks are written (python) · at 19:02:48Z · abandoned wrun_41M3CZ58FM0GHYYT9XYDQX6NS9
  • run-pickup-stall · getChunks returns same content as reading the stream (python) · at 19:02:48Z · abandoned wrun_41M3CZ58KW0GSP9Z3G44S1T9BF
  • run-pickup-stall · outputStreamInsideStepWorkflow - getWritable() called inside step functions (python) · at 19:03:05Z · abandoned wrun_41M3CZ5RN50GWNKDE94FPA938N
  • run-pickup-stall · utf8StreamWorkflow (python) · at 19:03:21Z · abandoned wrun_41M3CZ68JP0GZQ11MSF4N4J4Y5
  • run-pickup-stall · nullByteWorkflow (python) · at 19:03:24Z · abandoned wrun_41M3CZ6BPN0GVXSZAW6AS40FAY
  • run-pickup-stall · no startIndex (reads all chunks) (python) · at 19:03:25Z · abandoned wrun_41M3CZ6C830GHHKV9A7KBTVETW
  • run-pickup-stall · positive startIndex (skips first chunk) (python) · at 19:03:48Z · abandoned wrun_41M3CZ736W0GR1CNNZMWR392J8
  • run-pickup-stall · negative startIndex (reads from end) (python) · at 19:04:06Z · abandoned wrun_41M3CZ7M9D0GW1BC0STBMWFSA6
  • run-pickup-stall · getTailIndex returns correct index after stream completes (python) · at 19:04:25Z · abandoned wrun_41M3CZ873J0GK26P93FHQQJ4EM
  • run-pickup-stall · getChunks returns same content as reading the stream (python) · at 19:04:27Z · abandoned wrun_41M3CZ89G50GJGFN32BCZWBSFD
  • run-pickup-stall · hookCleanupTestWorkflow - hook token reuse after workflow completion (nextjs-webpack) · at 19:04:30Z · abandoned wrun_01M3CZ8D1HP6MJ152G2V16JSX6
  • run-pickup-stall · hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload (nextjs-webpack) · at 19:04:40Z · abandoned wrun_01M3CZ8PP6ZBS1P809GVB4M9YW
  • run-pickup-stall · 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution (nextjs-webpack) · at 19:04:40Z · abandoned wrun_01M3CZ8PVBJPAW42M4TF7F3TWN
  • run-pickup-stall · outputStreamInsideStepWorkflow - getWritable() called inside step functions (python) · at 19:04:48Z · abandoned wrun_41M3CZ8XSX0GME5KW8E60PMFD1
  • run-pickup-stall · writableForwardedFromWorkflowWorkflow (python) · at 19:05:06Z · abandoned wrun_41M3CZ9EWD0GNA1R02W1MSXPAJ
  • run-pickup-stall · writableForwardedFromStepWorkflow (python) · at 19:05:23Z · abandoned wrun_41M3CZA0AS0GQ1J2B18YHYW2MM
  • run-pickup-stall · utf8StreamWorkflow (python) · at 19:05:25Z · abandoned wrun_41M3CZA1PJ0GWK770ZVHX3BBY0
  • run-pickup-stall · promiseRaceStressTestWorkflow (python) · at 19:05:29Z · abandoned wrun_41M3CZA5WN0GW768YEM08P7BWV
  • run-pickup-stall · regular Error retries until success (python) · at 19:05:49Z · abandoned wrun_41M3CZAS810GPZPZS1Z7JMQHPV
  • run-pickup-stall · FatalError fails immediately without retries (python) · at 19:06:29Z · abandoned wrun_41M3CZC0FP0GKSVFY0JJCN5W41
  • run-pickup-stall · RetryableError respects custom retryAfter delay (python) · at 19:06:49Z · abandoned wrun_41M3CZCKV20GX65S6BHERB4ZQR
  • run-pickup-stall · maxRetries=0 disables retries (python) · at 19:07:06Z · abandoned wrun_41M3CZD42D0GK701WX11XM0SQ1
  • run-pickup-stall · FatalError can be caught and detected with FatalError.is() (python) · at 19:07:23Z · abandoned wrun_41M3CZDNGT0GX60B6ST3E8R4NP
  • run-pickup-stall · step throw round-trips FatalError with cause chain to workflow catch (python) · at 19:07:25Z · abandoned wrun_41M3CZDPWJ0GHW82J5F36TD54T
  • run-pickup-stall · workflow throw round-trips FatalError + cause through run_failed event (python) · at 19:07:29Z · abandoned wrun_41M3CZDV2P0GTFZMB6H9BEPFY8
  • run-pickup-stall · StepNotRegisteredError fails the step but workflow can catch it (python) · at 19:07:49Z · abandoned wrun_41M3CZEEE30GPQF3TDJF05G8WH
  • run-pickup-stall · StepNotRegisteredError fails the run when not caught in workflow (python) · at 19:08:12Z · abandoned wrun_41M3CZEYND0GKEKJ0SJ6BNG4ZS
  • run-pickup-stall · promiseRaceStressTestWorkflow (python) · at 19:09:19Z · abandoned wrun_41M3CZGPBH0GNZQKGSN34MKTJN
  • run-pickup-stall · writableForwardedFromWorkflowWorkflow (python) · at 19:09:42Z · abandoned wrun_41M3CZGVQS0GK2M2M008NEMXWD
  • run-pickup-stall · writableForwardedFromStepWorkflow (python) · at 19:09:45Z · abandoned wrun_41M3CZGWYG0GMR13R0SAN9VBCJ
  • run-pickup-stall · regular Error retries until success (python) · at 19:10:02Z · abandoned wrun_41M3CZGS8D0GHH6ZCWN6TNJGJJ
  • run-pickup-stall · hookCleanupTestWorkflow - hook token reuse after workflow completion (python) · at 19:10:02Z · abandoned wrun_41M3CZHC6Z0GK2NG50DEPENCVH
  • run-pickup-stall · FatalError fails immediately without retries (python) · at 19:10:54Z · abandoned wrun_41M3CZJKVC0GX3KTVRMQJ5YBCR
  • run-pickup-stall · RetryableError respects custom retryAfter delay (python) · at 19:10:55Z · abandoned wrun_41M3CZK6T00GPHGBPNW11BF7XX
  • run-pickup-stall · maxRetries=0 disables retries (python) · at 19:10:59Z · abandoned wrun_41M3CZKE820GP64KXFBKMT9F2H
  • run-pickup-stall · FatalError can be caught and detected with FatalError.is() (python) · at 19:11:12Z · abandoned wrun_41M3CZMGXS0GNEX18WECM2AHMY
  • run-pickup-stall · step throw round-trips FatalError with cause chain to workflow catch (python) · at 19:11:13Z · abandoned wrun_41M3CZMJ4F0GK212EQ1ARDR0JH
  • run-pickup-stall · workflow throw round-trips FatalError + cause through run_failed event (python) · at 19:11:15Z · abandoned wrun_41M3CZMQ950GJVVHHWCWFPJK18
  • run-pickup-stall · StepNotRegisteredError fails the step but workflow can catch it (python) · at 19:11:28Z · abandoned wrun_41M3CZN42A0GK507VYW5QK620M
  • run-pickup-stall · StepNotRegisteredError fails the run when not caught in workflow (python) · at 19:11:35Z · abandoned wrun_41M3CZNB880GHDH6445CJKSRGK
  • run-pickup-stall · hookCleanupTestWorkflow - hook token reuse after workflow completion (python) · at 19:12:09Z · abandoned wrun_41M3CZPCQG0GW8WZ02QSJZY924
  • run-pickup-stall · hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload (python) · at 19:12:15Z · abandoned wrun_41M3CZPJPM0GKH3EXNM02F1CD9
  • run-pickup-stall · 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution (python) · at 19:12:28Z · abandoned wrun_41M3CZPYNA0GH209AVCHW8D0WD
  • run-pickup-stall · 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution (python) · at 19:12:40Z · abandoned wrun_41M3CZQAEV0GRY4ZS102AC1V5D
  • run-pickup-stall · hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps (python) · at 19:12:57Z · abandoned wrun_41M3CZQV320GWRF7PF2XHJZ1QM
  • run-pickup-stall · hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (python) · at 19:13:12Z · abandoned wrun_41M3CZR9EP0GWCDEY6CHVV8616
  • run-pickup-stall · hookGetConflictWorkflow - awaiting hook.getConflict() registers hook without payload (python) · at 19:13:16Z · abandoned wrun_41M3CZRE800GRMG65ZN1DD9XCT
  • run-pickup-stall · 'hookGetConflictWithPriorStepWorkflow' - hook.getConflict() does not block step execution (python) · at 19:13:29Z · abandoned wrun_41M3CZRT4Z0GQN764ED898SX2Z
  • run-pickup-stall · 'hookGetConflictWithParallelStepWorkfl…' - hook.getConflict() does not block step execution (python) · at 19:13:41Z · abandoned wrun_41M3CZS5VW0GHK39JF9PSRK9GX
  • run-pickup-stall · hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (python) · at 19:14:00Z · abandoned wrun_41M3CZSQZ20GHHX40EJW3RK6SY
  • run-pickup-stall · hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data (python) · at 19:14:19Z · abandoned wrun_41M3CZTAG10GGCGK8TVFV6J5SV
  • run-pickup-stall · hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (python) · at 19:14:30Z · abandoned wrun_41M3CZTP3T0GK92TFV6CHQSWWW
  • run-pickup-stall · hookGetConflictThenStepParallelWorkflow - hook.getConflict() continuation step runs alongside other steps (python) · at 19:14:30Z · abandoned wrun_41M3CZTMDY0GRWG3D4A1GKYJQR
  • run-pickup-stall · hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (python) · at 19:14:44Z · abandoned wrun_41M3CZV2970GGYKWTRHFN4DDNV
  • run-pickup-stall · resume-or-start route pattern - resumeHook retried after start() reaches the new run (python) · at 19:14:54Z · abandoned wrun_41M3CZV9JM0GS1EV5Z9MDPQTXZ
  • run-pickup-stall · hookClaimOnlyMutexWorkflow - hook works as a pure run mutex without payload data (python) · at 19:15:10Z · abandoned wrun_41M3CZVV6W0GP2NXER98T16QYQ
  • run-pickup-stall · hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (python) · at 19:15:20Z · abandoned wrun_41M3CZW5Z20GMH5ZVNTWBDFDFC
  • run-pickup-stall · hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (python) · at 19:15:34Z · abandoned wrun_41M3CZWK1B0GX0XBGT7YDQY003
  • run-pickup-stall · resume-or-start route pattern - resumeHook retried after start() reaches the new run (python) · at 19:15:46Z · abandoned wrun_41M3CZWZP00GTV7SPCCHG9GQP2
  • run-pickup-stall · hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running (python) · at 19:15:59Z · abandoned wrun_41M3CZXCP20GM3DSJDAC50BAM7
  • run-pickup-stall · hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() (python) · at 19:16:00Z · abandoned wrun_41M3CZXDJX0GZ02CJMZWNHFJ43
  • run-pickup-stall · spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step (python) · at 19:16:08Z · abandoned wrun_41M3CZXNX90GVQ55Y1Z1VQXDK7
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 19:16:27Z · abandoned wrun_41M3CZY8KC0GTAW9A89S8KVP0P
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 19:16:34Z · abandoned wrun_41M3CZYEY20GKWM6X5VTRDX1EJ
  • run-pickup-stall · hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running (python) · at 19:16:47Z · abandoned wrun_41M3CZYVC00GV4N24Y4J7B2X6X
  • run-pickup-stall · hookTokenReuseLoopWorkflow - same run recreates a hook with the same token after dispose() (python) · at 19:16:47Z · abandoned wrun_41M3CZYVXV0GV386Z8VAD8CZVB
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 19:16:59Z · abandoned wrun_41M3CZZ7WP0GKTC27NCJRCJNRC
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 19:17:06Z · abandoned wrun_41M3CZZEEH0GRFPE9NDE0EGDKZ
  • run-pickup-stall · hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep (python) · at 19:17:32Z · abandoned wrun_41M3D007F00GXQF6CVFMMH17RD
  • run-pickup-stall · hookWithSleepFinalStepWorkflow - step only on final payload (python) · at 19:17:34Z · abandoned wrun_41M3D009EZ0GP7QNTMEGN00XAJ
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 19:17:34Z · abandoned wrun_41M3D00A8A0GYJK3ZRET8DRKXN
  • run-pickup-stall · sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) (python) · at 19:17:38Z · abandoned wrun_41M3D00DY40GZ8B62H4F1YHP9B
  • run-pickup-stall · spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step (python) · at 19:18:09Z · abandoned wrun_41M3D01BX10GSQ6VXVBW04JKGH
  • run-pickup-stall · hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep (python) · at 19:18:19Z · abandoned wrun_41M3D01NDT0GRBNGB55ERD88VV
  • run-pickup-stall · hookWithSleepFinalStepWorkflow - step only on final payload (python) · at 19:18:22Z · abandoned wrun_41M3D01QV00GJ48JZ0J3NA6Y2N
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 19:18:36Z · abandoned wrun_41M3D025WV0GSF7TJV11QR3KWB
  • run-pickup-stall · sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) (python) · at 19:18:39Z · abandoned wrun_41M3D029DW0GTJ38C7VYFYWGC0
  • run-pickup-stall · abortTimeoutWorkflow: timeout cancels long-running step (python) · at 19:19:24Z · abandoned wrun_41M3D03B560GVSWKBWTMRG1E7R
  • run-pickup-stall · abortParallelWorkflow: abort cancels all parallel steps (python) · at 19:19:30Z · abandoned wrun_41M3D03FDM0GTHGHFCY1RGJBVR
  • run-pickup-stall · metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (Vercel World Regression: getWorkflowMetadata() fully breaking runs #1577) (python) · at 19:20:01Z · abandoned wrun_41M3D0440W0GHJ6380HYGAP5W2
  • run-pickup-stall · abortReasonWorkflow: abort reason preserved across boundaries (python) · at 19:20:04Z · abandoned wrun_41M3D040FV0GQDJQDZHRT3VPG0
  • run-pickup-stall · abortViaHookWorkflow: external hook triggers abort on in-flight step (python) · at 19:21:12Z · abandoned wrun_41M3D055R70GR8CVXWMGZQD13Q
  • run-pickup-stall · abortTimeoutWorkflow: timeout cancels long-running step (python) · at 19:21:25Z · abandoned wrun_41M3D06VXG0GRQJ2BMBV3F3CQX
  • run-pickup-stall · abortParallelWorkflow: abort cancels all parallel steps (python) · at 19:21:26Z · abandoned wrun_41M3D070B80GQ2XAKBT0YE9HR1
  • run-pickup-stall · start: initial attributes are seeded on run creation (python) · at 19:21:26Z · abandoned wrun_41M3D0718X0GXYM3J7JGQECP56
  • run-pickup-stall · start: reserved-prefix initial attributes are seeded with allowReservedAttributes (python) · at 19:21:32Z · abandoned wrun_41M3D07G8M0GH5YZYKMZ83JG08
  • run-pickup-stall · setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly (python) · at 19:21:43Z · abandoned wrun_41M3D07X0C0GGC6YGVFF9AKP44
  • run-pickup-stall · setAttributesInsideStepWorkflow: step-body calls append attributed native events (python) · at 19:21:45Z · abandoned wrun_41M3D07YJD0GVTNT8ZXT90B088
  • run-pickup-stall · abortReasonWorkflow: abort reason preserved across boundaries (python) · at 19:22:01Z · abandoned wrun_41M3D08EDS0GQ868QJDG8E2GX3
  • run-pickup-stall · metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (Vercel World Regression: getWorkflowMetadata() fully breaking runs #1577) (python) · at 19:22:09Z · abandoned wrun_41M3D08PGG0GV1TVQ3KVFYTSCA
  • run-pickup-stall · Promise.all of disjoint-key writes: every key lands (python) · at 19:22:14Z · abandoned wrun_41M3D08V9Y0GKWVYJMC2C61D4E
  • run-pickup-stall · abortViaHookWorkflow: external hook triggers abort on in-flight step (python) · at 19:22:15Z · abandoned wrun_41M3D08VVJ0GGXH7KXDR253DX1
  • run-pickup-stall · start: initial attributes are seeded on run creation (python) · at 19:22:29Z · abandoned wrun_41M3D099XA0GGT7JJWX5VZYVRZ
  • run-pickup-stall · start: reserved-prefix initial attributes are seeded with allowReservedAttributes (python) · at 19:22:44Z · abandoned wrun_41M3D09RKE0GWYGYW8FYQS0M26
  • run-pickup-stall · setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly (python) · at 19:23:00Z · abandoned wrun_41M3D0A81C0GT66SRYQ8FCF8YA
  • run-pickup-stall · setAttributesInsideStepWorkflow: step-body calls append attributed native events (python) · at 19:23:02Z · abandoned wrun_41M3D0AA2H0GZ6CX6SGN2Z60CP
  • run-pickup-stall · Promise.all of disjoint-key writes: every key lands (python) · at 19:23:04Z · abandoned wrun_41M3D0ABVR0GJAADTN12W83KBP
  • run-pickup-stall · workflow throws after awaited setAttributes: attribute still persists on the failed run (python) · at 19:23:09Z · abandoned wrun_41M3D0AH3F0GP3D9V7TQWRG6DR
  • run-pickup-stall · workflow throws after awaited setAttributes: attribute still persists on the failed run (python) · at 19:23:40Z · abandoned wrun_41M3D0BF660GZZA5HCJAQMKHX0

E2E Test Summary

Summary
Passed Failed Skipped Total
❌ ▲ Vercel Production 3816 62 739 4617
✅ 💻 Local Development 4238 0 550 4788
✅ 📦 Local Production 4238 0 550 4788
✅ 🐘 Local Postgres 4238 0 550 4788
✅ 🪟 Windows 340 0 2 342
✅ vercel-http-transport 873 0 153 1026
✅ vercel-multi-region 27 0 0 27
✅ vercel-ws-transport 591 0 93 684
Total 18361 62 2637 21060
Details by Category

❌ ▲ Vercel Production

App Passed Failed Skipped
✅ astro-node 141 0 30
✅ astro-quickjs 141 0 30
✅ example-node 141 0 30
✅ example-quickjs 141 0 30
✅ express-node 141 0 30
✅ express-quickjs 141 0 30
✅ fastify-node 141 0 30
✅ fastify-quickjs 141 0 30
✅ hono-node 141 0 30
✅ hono-quickjs 141 0 30
✅ nest-node 141 0 30
✅ nest-quickjs 141 0 30
✅ nextjs-turbopack-node 168 0 3
✅ nextjs-turbopack-quickjs 168 0 3
✅ nextjs-webpack-node 168 0 3
✅ nextjs-webpack-quickjs 168 0 3
✅ nitro-node 141 0 30
✅ nitro-quickjs 141 0 30
✅ nuxt-node 141 0 30
✅ nuxt-quickjs 141 0 30
❌ python-node 4 62 105
✅ sveltekit-node 160 0 11
✅ sveltekit-quickjs 160 0 11
✅ tanstack-start-node 141 0 30
✅ tanstack-start-quickjs 141 0 30
✅ vite-node 141 0 30
✅ vite-quickjs 141 0 30

✅ 💻 Local Development

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

✅ 📦 Local Production

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

✅ 🐘 Local Postgres

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

✅ 🪟 Windows

App Passed Failed Skipped
✅ nextjs-turbopack-node 170 0 1
✅ nextjs-turbopack-quickjs 170 0 1

✅ vercel-http-transport

App Passed Failed Skipped
✅ example 141 0 30
✅ express 141 0 30
✅ hono 141 0 30
✅ nextjs-turbopack 168 0 3
✅ nitro 141 0 30
✅ vite 141 0 30

✅ vercel-multi-region

App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0

✅ vercel-ws-transport

App Passed Failed Skipped
✅ example 141 0 30
✅ express 141 0 30
✅ nextjs-turbopack 168 0 3
✅ vite 141 0 30

📋 View full workflow run

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 42 total

fence=per-spec

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

Full trace: world-sim.txt

@github-actions

github-actions Bot commented Sep 25, 2026 •

Copy link
Copy Markdown
Contributor
Framework Flow route Step reg. Framework output
hono 265.3 KiB (±0) 96.1 KiB (+106 B) 1.93 MiB (+199 B)
nextjs-turbopack 272.8 KiB (±0) 426 B (±0) 922.6 KiB (+63 B)
About these numbers

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

736a2d3 · run

@pranaygp
pranaygp merged commit bc18326 into main Sep 25, 2026
17 of 19 checks passed
@pranaygp
pranaygp deleted the pgp/start-explicit-deployment-without-current branch September 25, 2026 18:54
github-actions Bot added a commit that referenced this pull request Sep 25, 2026
…#4408)

recreateRunFromExisting (Replay Run) from a process that is not itself a
deployment failed because start() called world.getDeploymentId()
unconditionally. With a concrete target, an unavailable current deployment
now means a cross-deployment start instead of an error.

Co-authored-by: Claude <noreply@anthropic.com>
Signed-off-by: Pranay Prakash <pranay.gp@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #4425. Merge conflicts were resolved by AI — please review carefully. (backport job run)

pranaygp pushed a commit that referenced this pull request Sep 25, 2026
…#4408) (#4425)

recreateRunFromExisting (Replay Run) from a process that is not itself a
deployment failed because start() called world.getDeploymentId()
unconditionally. With a concrete target, an unavailable current deployment
now means a cross-deployment start instead of an error.

Signed-off-by: Pranay Prakash <pranay.gp@gmail.com>
Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot mentioned this pull request Sep 25, 2026

This branch was successfully deployed

18 active (3 outdated) deployments
Preview – workbench-sveltekit-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – example-nextjs-workflow-turbopack — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-vite-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-express-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-nuxt-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-hono-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-fastify-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-tanstack-start-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – example-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-nestjs-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-astro-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workflow-tarballs — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-nitro-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workflow-web — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workbench-python-workflow — 736a2d37 Deployed Sep 25, 2026 by vercel[bot]
Preview – workflow-swc-playground — 29e03f36 Deployed Sep 25, 2026 by vercel[bot]
Preview – workflow-docs — 29e03f36 Deployed Sep 25, 2026 by vercel[bot]
Preview – example-nextjs-workflow-webpack — 29e03f36 Deployed Sep 25, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants