fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(core): remove redundant hc_ prefix from health check correlationId - #1678

Merged
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id
Apr 9, 2026
Merged

fix(core): remove redundant hc_ prefix from health check correlationId#1678
TooTallNate merged 1 commit into
mainfrom
fix/health-check-correlation-id

Conversation

@TooTallNate

Copy link
Copy Markdown
Member

Summary

  • Remove the hc_ prefix from the health check correlationId generation, which was redundant since generateHealthCheckRunId() and getHealthCheckStreamName() already add their own prefixes
  • Before: wrun_hc_hc_01KNT... / __health_check__hc_01KNT...
  • After: wrun_hc_01KNT... / __health_check__01KNT...

The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
@TooTallNate
TooTallNate requested a review from a team as a code ownerApril 9, 2026 22:55
CopilotAI review requested due to automatic review settings April 9, 2026 22:55
@vercel

vercelBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e06029a

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch
@workflow/nuxtPatch
@workflow/aiPatch

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

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

📊 Benchmark Results

📈 Comparing against baseline from main branch. Green 🟢 = faster, Red 🔺 = slower.

workflow with no steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Express0.043s (~)1.005s (~)0.962s101.00x
💻 LocalNitro0.043s (+16.2% 🔺)1.006s (~)0.962s101.00x
🐘 PostgresNitro0.057s (-9.2% 🟢)1.009s (~)0.952s101.33x
🐘 PostgresExpress0.059s (-10.4% 🟢)1.011s (~)0.952s101.38x
workflow with 1 step

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
💻 Local🥇 Nitro1.127s (+2.2%)2.006s (~)0.879s101.00x
💻 LocalExpress1.127s (~)2.006s (~)0.879s101.00x
🐘 PostgresExpress1.151s (~)2.010s (~)0.859s101.02x
🐘 PostgresNitro1.156s (~)2.012s (~)0.856s101.03x
workflow with 10 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express10.890s (~)11.023s (~)0.132s31.00x
🐘 PostgresNitro10.900s (~)11.022s (~)0.122s31.00x
💻 LocalExpress10.934s (~)11.023s (~)0.090s31.00x
💻 LocalNitro10.934s (+2.5%)11.023s (~)0.089s31.00x
workflow with 25 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express14.551s (~)15.027s (~)0.475s41.00x
🐘 PostgresNitro14.595s (+0.7%)15.020s (~)0.425s41.00x
💻 LocalExpress14.941s (-0.8%)15.028s (-6.3% 🟢)0.087s41.03x
💻 LocalNitro14.995s (+5.4% 🔺)15.029s (~)0.034s41.03x
workflow with 50 sequential steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro14.031s (+1.2%)14.448s (+3.1%)0.417s71.00x
🐘 PostgresExpress14.043s (~)14.450s (-2.0%)0.407s71.00x
💻 LocalExpress16.637s (-1.8%)17.032s (~)0.394s61.19x
💻 LocalNitro16.777s (+12.4% 🔺)17.031s (+13.3% 🔺)0.254s61.20x
Promise.all with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro1.262s (~)2.009s (~)0.748s151.00x
🐘 PostgresExpress1.275s (~)2.009s (~)0.734s151.01x
💻 LocalNitro1.503s (+0.5%)2.005s (~)0.502s151.19x
💻 LocalExpress1.522s (~)2.006s (~)0.484s151.21x
Promise.all with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro2.337s (-1.0%)3.008s (~)0.672s101.00x
🐘 PostgresExpress2.390s (+2.6%)3.010s (~)0.620s101.02x
💻 LocalNitro2.885s (+5.8% 🔺)3.759s (+17.2% 🔺)0.874s81.23x
💻 LocalExpress2.917s (-8.4% 🟢)3.453s (-13.9% 🟢)0.537s91.25x
Promise.all with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro3.470s (-0.9%)4.009s (~)0.539s81.00x
🐘 PostgresExpress3.471s (-0.9%)4.010s (~)0.539s81.00x
💻 LocalExpress8.084s (-3.2%)9.027s (~)0.943s42.33x
💻 LocalNitro9.166s (+18.4% 🔺)9.525s (+11.8% 🔺)0.359s42.64x
Promise.race with 10 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.248s (-3.7%)2.008s (~)0.760s151.00x
🐘 PostgresNitro1.256s (~)2.009s (~)0.754s151.01x
💻 LocalExpress1.544s (-1.3%)2.006s (~)0.462s151.24x
💻 LocalNitro1.575s (+4.6%)2.006s (~)0.431s151.26x
Promise.race with 25 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express2.319s (-2.5%)3.011s (~)0.691s101.00x
🐘 PostgresNitro2.343s (~)3.011s (~)0.668s101.01x
💻 LocalExpress2.997s (-5.5% 🟢)3.565s (-8.2% 🟢)0.568s91.29x
💻 LocalNitro3.147s (-10.0% 🟢)3.886s (-3.2%)0.738s81.36x
Promise.race with 50 concurrent steps

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.469s (-0.6%)4.009s (~)0.540s81.00x
🐘 PostgresNitro3.479s (~)4.010s (~)0.530s81.00x
💻 LocalExpress8.822s (-13.6% 🟢)9.020s (-18.2% 🟢)0.198s42.54x
💻 LocalNitro9.106s (+7.1% 🔺)9.525s (+5.6% 🔺)0.420s42.62x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.812s (-6.0% 🟢)1.006s (~)0.194s601.00x
🐘 PostgresNitro0.840s (~)1.006s (-1.7%)0.165s601.03x
💻 LocalNitro1.007s (+36.7% 🔺)1.505s (+49.9% 🔺)0.498s401.24x
💻 LocalExpress1.106s (+9.1% 🔺)1.391s (-18.2% 🟢)0.285s441.36x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.913s (-11.3% 🟢)2.076s (-30.3% 🟢)0.162s441.00x
🐘 PostgresNitro2.074s (+6.7% 🔺)2.822s (+34.3% 🔺)0.748s321.08x
💻 LocalExpress3.022s (-2.2%)3.649s (-9.0% 🟢)0.626s251.58x
💻 LocalNitro3.052s (+18.9% 🔺)3.884s (+22.1% 🔺)0.832s241.60x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express3.890s (-9.8% 🟢)4.109s (-18.0% 🟢)0.219s301.00x
🐘 PostgresNitro4.098s (+2.7%)4.704s (+9.5% 🔺)0.607s261.05x
💻 LocalExpress9.141s (-0.7%)9.864s (-1.6%)0.722s132.35x
💻 LocalNitro9.240s (+19.8% 🔺)9.942s (+21.0% 🔺)0.702s132.38x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.282s (~)1.007s (~)0.724s601.00x
🐘 PostgresExpress0.285s (-3.8%)1.007s (~)0.722s601.01x
💻 LocalNitro0.605s (-8.8% 🟢)1.022s (+1.7%)0.417s592.14x
💻 LocalExpress0.606s (+1.6%)1.004s (-1.7%)0.398s602.15x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.480s (-8.7% 🟢)1.006s (~)0.526s901.00x
🐘 PostgresNitro0.501s (+2.5%)1.007s (~)0.506s901.04x
💻 LocalExpress2.516s (~)3.009s (~)0.492s305.24x
💻 LocalNitro2.540s (-7.5% 🟢)3.009s (-5.5% 🟢)0.469s305.29x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

WorldFrameworkWorkflow TimeWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Nitro0.800s (+1.8%)1.008s (~)0.208s1201.00x
🐘 PostgresExpress0.807s (-4.0%)1.008s (-1.1%)0.201s1201.01x
💻 LocalExpress11.136s (+1.2%)11.755s (+0.8%)0.619s1113.92x
💻 LocalNitro11.150s (~)11.845s (~)0.695s1113.93x
Stream Benchmarks(includes TTFB metrics)
workflow with stream

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.195s (-9.3% 🟢)1.002s (+0.8%)0.001s (-41.2% 🟢)1.009s (~)0.815s101.00x
💻 LocalExpress0.205s (-1.9%)1.004s (~)0.012s (-0.8%)1.018s (~)0.813s101.05x
💻 LocalNitro0.207s (+40.1% 🔺)1.004s (~)0.012s (+33.0% 🔺)1.018s (~)0.812s101.06x
🐘 PostgresNitro0.215s (+8.0% 🔺)0.999s (~)0.001s (-25.0% 🟢)1.010s (~)0.794s101.11x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.614s (-5.1% 🟢)1.008s (~)0.004s (-25.6% 🟢)1.022s (~)0.408s591.00x
🐘 PostgresNitro0.622s (+2.9%)1.004s (~)0.005s (+25.1% 🔺)1.023s (~)0.401s591.01x
💻 LocalExpress0.732s (-0.5%)1.013s (~)0.009s (-4.7%)1.024s (~)0.292s591.19x
💻 LocalNitro0.928s (+40.2% 🔺)1.012s (~)0.009s (-12.8% 🟢)1.220s (+18.9% 🔺)0.292s511.51x
10 parallel streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express0.941s (-5.2% 🟢)1.127s (-15.6% 🟢)0.000s (-58.5% 🟢)1.147s (-16.3% 🟢)0.206s531.00x
🐘 PostgresNitro0.943s (~)1.209s (+5.4% 🔺)0.000s (-66.0% 🟢)1.229s (+5.8% 🔺)0.286s511.00x
💻 LocalNitro1.228s (-7.3% 🟢)2.020s (~)0.000s (-41.2% 🟢)2.022s (~)0.793s301.31x
💻 LocalExpress1.237s (-2.9%)2.021s (~)0.000s (+9.1% 🔺)2.023s (~)0.786s301.31x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

WorldFrameworkWorkflow TimeTTFBSlurpWall TimeOverheadSamplesvs Fastest
🐘 Postgres🥇 Express1.733s (-3.0%)2.103s (-1.8%)0.000s (+Infinity% 🔺)2.113s (-1.8%)0.379s291.00x
🐘 PostgresNitro1.784s (~)2.177s (+3.8%)0.000s (-100.0% 🟢)2.188s (+3.6%)0.404s281.03x
💻 LocalExpress3.542s (-3.3%)4.033s (-3.3%)0.000s (-54.5% 🟢)4.035s (-3.3%)0.494s152.04x
💻 LocalNitro3.604s (-8.7% 🟢)4.099s (-9.6% 🟢)0.000s (-40.6% 🟢)4.101s (-9.6% 🟢)0.498s152.08x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World🥇 Fastest FrameworkWins
💻 LocalExpress15/21
🐘 PostgresExpress14/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework🥇 Fastest WorldWins
Express🐘 Postgres19/21
Nitro🐘 Postgres18/21
Column Definitions
  • Workflow Time: Runtime reported by workflow (completedAt - createdAt) - primary metric
  • TTFB: Time to First Byte - time from workflow start until first stream byte received (stream benchmarks only)
  • Slurp: Time from first byte to complete stream consumption (stream benchmarks only)
  • Wall Time: Total testbench time (trigger workflow + poll for result)
  • Overhead: Testbench overhead (Wall Time - Workflow Time)
  • Samples: Number of benchmark iterations run
  • vs Fastest: How much slower compared to the fastest configuration for this benchmark

Worlds:

  • 💻 Local: In-memory filesystem world (local development)
  • 🐘 Postgres: PostgreSQL database world (local development)
  • ▲ Vercel: Vercel production/preview deployment
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run


Some benchmark jobs failed:

  • Local: success
  • Postgres: success
  • Vercel: failure

Check the workflow run for details.

@github-actions

github-actionsBot commented Apr 9, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
✅ ▲ Vercel Production923067990
✅ 💻 Local Development89801821080
✅ 📦 Local Production89801821080
✅ 🐘 Local Postgres89801821080
✅ 🪟 Windows820890
❌ 🌍 Community Worlds1337424231
✅ 📋 Other228042270
Total4060746874821

❌ Failed Tests

🌍 Community Worlds (74 failed)

mongodb (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

redis (7 failed):

  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W

turso (60 failed):

  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • addTenWorkflow | wrun_01KNT7DHQ9N122ZY31MAD7P4XJ
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_01KNT7F6SP1PE6VHRFXG7MQF36
  • should work with react rendering in step
  • promiseAllWorkflow | wrun_01KNT7DRGEW314WWAX97T4NT0K
  • promiseRaceWorkflow | wrun_01KNT7DX14ZPE2XN50WJPZVY6N
  • promiseAnyWorkflow | wrun_01KNT7DZ4YKFDTJT0CQ30DDQMV
  • importedStepOnlyWorkflow | wrun_01KNT7FKN851NBA8AE36MX9NN9
  • hookWorkflow | wrun_01KNT7EC5D0ZYCRRS2GVVA70P2
  • hookWorkflow is not resumable via public webhook endpoint | wrun_01KNT7EPRGX7W72S2NYF5R5T6R
  • webhookWorkflow | wrun_01KNT7EZN6V6DHENMDWVMZT0H9
  • sleepingWorkflow | wrun_01KNT7F6YFAG17JRN1GQWDX4D3
  • parallelSleepWorkflow | wrun_01KNT7FJG64M5GEGA037K5X6B9
  • nullByteWorkflow | wrun_01KNT7FPH6BA5ZMS69M77YDA3F
  • workflowAndStepMetadataWorkflow | wrun_01KNT7FRNE4P3FE7KFMPC8KJHV
  • fetchWorkflow | wrun_01KNT7JBCWCC2F218MZZ4Q6FR6
  • promiseRaceStressTestWorkflow | wrun_01KNT7JESHPQ6HQ5AHH413DYE3
  • 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 not registered WorkflowNotRegisteredError fails the run when workflow does not exist
  • error handling not registered StepNotRegisteredError fails the step but workflow can catch it
  • error handling not registered StepNotRegisteredError fails the run when not caught in workflow
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_01KNT7NZ75EWYEJVEH95GEGKBK
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_01KNT7PM08CA4PH3VQRB8JEPPJ
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running | wrun_01KNT7QDN78MD3097WR9Z2KYWC
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars) | wrun_01KNT7R25M6054Q6QD1CDAPQ94
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument | wrun_01KNT7RBD1VQYEHGAT8JSV4P65
  • closureVariableWorkflow - nested step functions with closure variables | wrun_01KNT7RH6D0CY7YCCMXEM6D6G9
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step | wrun_01KNT7RKB7P9CEK8VF927W20SR
  • runClassSerializationWorkflow - Run instances serialize across workflow/step boundaries | wrun_01KNT7RYTCY0MWEAE9BFHKKPP9
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • health check (CLI) - workflow health command reports healthy endpoints
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly | wrun_01KNT7SE4PY5RB98DJ9W56EJ67
  • Calculator.calculate - static workflow method using static step methods from another class | wrun_01KNT7SKTNS0YFNAM51G48JMGB
  • AllInOneService.processNumber - static workflow method using sibling static step methods | wrun_01KNT7STRJHGEWAVZ6GA5ZR2FR
  • ChainableService.processWithThis - static step methods using this to reference the class | wrun_01KNT7T1KFD3C6Z4313ADE2N00
  • thisSerializationWorkflow - step function invoked with .call() and .apply() | wrun_01KNT7T7V6RYQBW49WVAVHAPSS
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE | wrun_01KNT7TEPR1MQZP823ZS7GPWPE
  • instanceMethodStepWorkflow - instance methods with "use step" directive | wrun_01KNT7TNDNEJYA68X08J9AA9GM
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context | wrun_01KNT7V1GDYG3DYWM6HTXDFB4J
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument | wrun_01KNT7VA26Y0D53AYYDFKXY00G
  • cancelRun - cancelling a running workflow | wrun_01KNT7VJ86M243P9X59BRZVHAW
  • cancelRun via CLI - cancelling a running workflow | wrun_01KNT7VVVAC0Y7FMXG0AW4JMPY
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep | wrun_01KNT7W81YG9RTM244S0SZZWGD
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_01KNT7WXTPWKXJ8B1AKCGK56P3
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control) | wrun_01KNT7XBF4JTPD2TA294N4GQZC
  • importMetaUrlWorkflow - import.meta.url is available in step bundles | wrun_01KNT7XJHK5W54Y4FRDPR9ZK2M
  • metadataFromHelperWorkflow - getWorkflowMetadata/getStepMetadata work from module-level helper (#1577) | wrun_01KNT7XMV6V5HX9JQ9F1430NG4
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_01KNT7XQ0NGF1T3PTBQKT05M4W
  • getterStepWorkflow - getter functions with "use step" directive | wrun_01KNT7XT8JQKXZ4NS4G1P16F2Z

Details by Category

✅ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro8307
✅ example8307
✅ express8307
✅ fastify8307
✅ hono8307
✅ nextjs-turbopack8802
✅ nextjs-webpack8802
✅ nitro8307
✅ nuxt8307
✅ sveltekit8307
✅ vite8307
✅ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable76014
✅ express-stable76014
✅ fastify-stable76014
✅ hono-stable76014
✅ nextjs-turbopack-canary63027
✅ nextjs-turbopack-stable8208
✅ nextjs-webpack-canary63027
✅ nextjs-webpack-stable8208
✅ nitro-stable76014
✅ nuxt-stable76014
✅ sveltekit-stable76014
✅ vite-stable76014
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack8208
❌ 🌍 Community Worlds
AppPassedFailedSkipped
✅ mongodb-dev600
❌ mongodb5678
✅ redis-dev600
❌ redis5678
✅ turso-dev600
❌ turso3608
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable76014
✅ e2e-local-postgres-nest-stable76014
✅ e2e-local-prod-nest-stable76014

📋 View full workflow run

CopilotAI 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.

Pull request overview

This PR removes a redundant hc_ prefix from the health check correlationId generation in @workflow/core, since the derived identifiers already add health-check-specific prefixes.

Changes:

  • Generate health check correlationId as a raw ULID (no hc_ prefix) to avoid doubled hc_hc_ in derived IDs.
  • Add a changeset marking this as a patch release for @workflow/core.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

FileDescription
packages/core/src/runtime/helpers.tsUpdates health check correlationId generation to avoid redundant prefixing in derived runId/stream name.
.changeset/fix-health-check-correlation-id.mdAdds a patch changeset documenting the correlationId prefix fix.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@TooTallNate
TooTallNate enabled auto-merge (squash) April 9, 2026 23:28
@TooTallNate
TooTallNate merged commit ea97bd6 into mainApr 9, 2026
164 of 170 checks passed
@TooTallNate
TooTallNate deleted the fix/health-check-correlation-id branch April 9, 2026 23:35
@ghostghost mentioned this pull request Apr 9, 2026
@TooTallNateTooTallNate added the backport-stable Cherry-pick this PR to the stable branch when merged label Apr 10, 2026
@ghost

Copy link
Copy Markdown

Backported to stable (ea97bd6 -> f5fb9b7).

ghost pushed a commit that referenced this pull request Apr 10, 2026
#1678)
The correlationId was generated as hc_${generateId()}, but
generateHealthCheckRunId() already adds wrun_hc_, producing
wrun_hc_hc_... Similarly, getHealthCheckStreamName() adds
__health_check__, making the hc_ prefix in correlationId redundant.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backport-stableCherry-pick this PR to the stable branch when merged

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@TooTallNate@VaguelySerious