Skip to content

[worlds] [runtime] Change serialized stream ID gen from v4 UUIDs to ULIDs and fix stream list endpoint#625

Merged
VaguelySerious merged 9 commits into
mainfrom
peter/stream-name-change
Dec 17, 2025
Merged

[worlds] [runtime] Change serialized stream ID gen from v4 UUIDs to ULIDs and fix stream list endpoint#625
VaguelySerious merged 9 commits into
mainfrom
peter/stream-name-change

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented Dec 16, 2025

Streams list in local/postgres world now shows all streams, including ones passed as step input/outputs, and those streams are now guaranteed to be ULIDs instead of UUIDv4.

image

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented Dec 16, 2025

🦋 Changeset detected

Latest commit: fbdd2d9

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

This PR includes changesets to release 14 packages
Name Type
@workflow/world-postgres Patch
@workflow/world-local Patch
@workflow/core Patch
@workflow/cli Patch
@workflow/builders Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/web-shared Patch
workflow Patch
@workflow/world-testing Patch
@workflow/astro Patch
@workflow/sveltekit Patch
@workflow/nuxt Patch
@workflow/ai Patch

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

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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented Dec 16, 2025

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

Project Deployment Review Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment Dec 17, 2025 7:33pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment Dec 17, 2025 7:33pm
example-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-astro-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-express-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-fastify-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-hono-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-nitro-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-nuxt-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-sveltekit-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workbench-vite-workflow Ready Ready Preview, Comment Dec 17, 2025 7:33pm
workflow-docs Ready Ready Preview, Comment Dec 17, 2025 7:33pm

@VaguelySerious VaguelySerious marked this pull request as draft December 16, 2025 12:59
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 16, 2025

📊 Benchmark Results

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

workflow with no steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.032s (-30.0% 🟢) 1.007s (~) 0.976s 10 1.00x
🌐 Starter Next.js (Turbopack) 0.039s (+34.5% 🔺) 1.014s (~) 0.975s 10 1.24x
🌐 Redis Next.js (Turbopack) 0.041s (-3.5%) 1.017s (~) 0.977s 10 1.30x
💻 Local Nitro 0.041s (-10.2% 🟢) 1.006s (~) 0.965s 10 1.31x
💻 Local Next.js (Turbopack) 0.043s (+5.1% 🔺) 1.019s (~) 0.975s 10 1.37x
🌐 MongoDB Next.js (Turbopack) 0.064s (-32.2% 🟢) 1.015s (~) 0.950s 10 2.04x
🌐 Turso Next.js (Turbopack) 0.098s (-13.5% 🟢) 1.014s (~) 0.916s 10 3.10x
🐘 Postgres Next.js (Turbopack) 0.122s (-8.3% 🟢) 1.020s (~) 0.898s 10 3.88x
🐘 Postgres Nitro 0.219s (-30.5% 🟢) 1.012s (~) 0.793s 10 6.95x
🐘 Postgres Express 0.341s (+28.3% 🔺) 1.013s (-0.8%) 0.672s 10 10.83x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 0.662s (-21.3% 🟢) 1.600s (-4.9%) 0.939s 10 1.00x
▲ Vercel Express 0.677s (-7.6% 🟢) 1.627s (-3.8%) 0.950s 10 1.02x
▲ Vercel Nitro 0.696s (+23.1% 🔺) 1.696s (+22.6% 🔺) 1.000s 10 1.05x

🔍 Observability: Next.js (Turbopack) | Express | Nitro

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.076s (-3.4%) 2.007s (~) 0.931s 10 1.00x
💻 Local Next.js (Turbopack) 1.097s (~) 2.012s (~) 0.915s 10 1.02x
🌐 Starter Next.js (Turbopack) 1.097s (+2.4%) 2.009s (~) 0.912s 10 1.02x
🌐 Redis Next.js (Turbopack) 1.100s (~) 2.012s (~) 0.912s 10 1.02x
💻 Local Nitro 1.111s (-0.6%) 2.007s (~) 0.896s 10 1.03x
🌐 Turso Next.js (Turbopack) 1.295s (~) 2.013s (~) 0.717s 10 1.20x
🌐 MongoDB Next.js (Turbopack) 1.306s (~) 2.015s (~) 0.709s 10 1.21x
🐘 Postgres Express 1.696s (-20.5% 🟢) 2.013s (-33.2% 🟢) 0.317s 10 1.58x
🐘 Postgres Next.js (Turbopack) 1.714s (-30.1% 🟢) 2.016s (-33.2% 🟢) 0.301s 10 1.59x
🐘 Postgres Nitro 2.119s (-2.5%) 3.015s (~) 0.896s 10 1.97x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.661s (+1.0%) 3.795s (+7.8% 🔺) 1.134s 10 1.00x
▲ Vercel Express 2.916s (+16.6% 🔺) 3.760s (+6.6% 🔺) 0.844s 10 1.10x
▲ Vercel Next.js (Turbopack) 2.929s (+9.3% 🔺) 4.306s (+20.9% 🔺) 1.377s 10 1.10x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.514s (-2.7%) 11.014s (~) 0.500s 5 1.00x
🌐 Starter Next.js (Turbopack) 10.593s (+1.3%) 11.012s (~) 0.418s 5 1.01x
🌐 Redis Next.js (Turbopack) 10.666s (~) 11.018s (~) 0.352s 5 1.01x
💻 Local Next.js (Turbopack) 10.687s (~) 11.018s (~) 0.331s 5 1.02x
💻 Local Nitro 10.788s (~) 11.014s (~) 0.227s 5 1.03x
🌐 Turso Next.js (Turbopack) 12.222s (~) 13.024s (~) 0.802s 5 1.16x
🌐 MongoDB Next.js (Turbopack) 12.295s (~) 13.036s (~) 0.740s 5 1.17x
🐘 Postgres Next.js (Turbopack) 14.916s (-9.6% 🟢) 15.237s (-10.6% 🟢) 0.321s 5 1.42x
🐘 Postgres Express 15.313s (-25.2% 🟢) 16.033s (-23.8% 🟢) 0.720s 5 1.46x
🐘 Postgres Nitro 15.414s (-0.8%) 16.029s (-1.3%) 0.615s 5 1.47x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 22.885s (+9.5% 🔺) 23.772s (+10.1% 🔺) 0.888s 5 1.00x
▲ Vercel Next.js (Turbopack) 23.020s (+8.9% 🔺) 23.654s (+8.3% 🔺) 0.634s 5 1.01x
▲ Vercel Express 23.701s (+16.0% 🔺) 24.812s (+17.2% 🔺) 1.111s 5 1.04x

🔍 Observability: Nitro | Next.js (Turbopack) | Express

workflow with 10 parallel steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.312s (-7.5% 🟢) 2.007s (~) 0.695s 5 1.00x
🌐 Redis Next.js (Turbopack) 1.332s (-0.7%) 2.010s (~) 0.678s 5 1.02x
💻 Local Next.js (Turbopack) 1.352s (~) 2.011s (~) 0.659s 5 1.03x
🌐 Starter Next.js (Turbopack) 1.353s (+3.0%) 2.008s (~) 0.655s 5 1.03x
💻 Local Nitro 1.406s (+0.8%) 2.007s (~) 0.601s 5 1.07x
🐘 Postgres Next.js (Turbopack) 1.667s (-7.7% 🟢) 2.215s (~) 0.547s 5 1.27x
🌐 MongoDB Next.js (Turbopack) 2.154s (+1.4%) 3.015s (~) 0.861s 5 1.64x
🌐 Turso Next.js (Turbopack) 2.191s (~) 3.014s (~) 0.823s 5 1.67x
🐘 Postgres Nitro 2.293s (+3.1%) 2.812s (+16.7% 🔺) 0.520s 5 1.75x
🐘 Postgres Express 2.299s (-10.6% 🟢) 2.613s (-13.3% 🟢) 0.313s 5 1.75x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 4.133s (+12.2% 🔺) 5.071s (+13.6% 🔺) 0.938s 5 1.00x
▲ Vercel Nitro 4.226s (+10.4% 🔺) 5.078s (+10.7% 🔺) 0.852s 5 1.02x
▲ Vercel Next.js (Turbopack) 4.313s (+10.0% 🔺) 4.955s (+8.5% 🔺) 0.642s 5 1.04x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

stress test: Promise.all with 100 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Starter 🥇 Next.js (Turbopack) 6.535s (+6.1% 🔺) 6.795s (+7.4% 🔺) 0.260s 5 1.00x
🌐 Redis Next.js (Turbopack) 7.835s (-7.2% 🟢) 8.487s (-6.5% 🟢) 0.652s 4 1.20x
🐘 Postgres Nitro 8.742s (-0.8%) 9.001s (-2.1%) 0.259s 4 1.34x
🐘 Postgres Next.js (Turbopack) 8.863s (-2.4%) 9.065s (-4.5%) 0.202s 4 1.36x
🐘 Postgres Express 9.121s (-1.7%) 9.238s (-4.6%) 0.117s 4 1.40x
💻 Local Express 11.331s (-15.8% 🟢) 11.588s (-14.9% 🟢) 0.257s 3 1.73x
💻 Local Nitro 13.695s (~) 13.758s (-1.4%) 0.063s 3 2.10x
💻 Local Next.js (Turbopack) 14.160s (-9.0% 🟢) 14.411s (-9.2% 🟢) 0.251s 3 2.17x
🌐 Turso Next.js (Turbopack) 20.078s (+0.6%) 20.541s (~) 0.463s 2 3.07x
🌐 MongoDB Next.js (Turbopack) 20.161s (+0.6%) 20.534s (~) 0.373s 2 3.08x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 18.706s (-18.0% 🟢) 19.760s (-17.2% 🟢) 1.055s 2 1.00x
▲ Vercel Nitro 20.640s (-7.0% 🟢) 21.929s (-6.1% 🟢) 1.288s 2 1.10x
▲ Vercel Next.js (Turbopack) 21.221s (~) 21.875s (+0.9%) 0.655s 2 1.13x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

stress test: Promise.race with 100 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Starter 🥇 Next.js (Turbopack) 6.760s (+10.5% 🔺) 7.026s (+9.4% 🔺) 0.266s 5 1.00x
🌐 Redis Next.js (Turbopack) 8.263s (-3.3%) 8.363s (-7.5% 🟢) 0.100s 4 1.22x
🐘 Postgres Next.js (Turbopack) 9.402s (+4.0%) 9.637s (+2.7%) 0.236s 4 1.39x
🐘 Postgres Express 9.465s (-6.8% 🟢) 9.901s (-4.9%) 0.436s 4 1.40x
🐘 Postgres Nitro 9.855s (+9.0% 🔺) 10.093s (+8.1% 🔺) 0.238s 3 1.46x
💻 Local Express 13.269s (-12.9% 🟢) 13.420s (-13.3% 🟢) 0.151s 3 1.96x
💻 Local Nitro 14.137s (-13.2% 🟢) 14.235s (-13.1% 🟢) 0.097s 3 2.09x
💻 Local Next.js (Turbopack) 16.087s (-6.4% 🟢) 16.396s (-6.5% 🟢) 0.309s 2 2.38x
🌐 MongoDB Next.js (Turbopack) 20.058s (~) 20.571s (~) 0.514s 2 2.97x
🌐 Turso Next.js (Turbopack) 20.312s (+1.1%) 20.532s (~) 0.220s 2 3.00x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 18.537s (-6.2% 🟢) 19.617s (-4.2%) 1.080s 2 1.00x
▲ Vercel Express 20.478s (-2.7%) 21.249s (-4.7%) 0.771s 2 1.10x
▲ Vercel Next.js (Turbopack) 21.982s (+5.5% 🔺) 22.633s (+5.4% 🔺) 0.651s 2 1.19x

🔍 Observability: Nitro | Express | Next.js (Turbopack)

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 0.106s (-41.8% 🟢) 0.999s (+0.6%) 0.012s (-26.8% 🟢) 1.018s (-0.5%) 0.913s 10 1.00x
🌐 Starter Next.js (Turbopack) 0.127s (+34.3% 🔺) 1.005s (~) 0.000s (NaN%) 1.010s (~) 0.883s 10 1.20x
💻 Local Next.js (Turbopack) 0.139s (-3.4%) 1.002s (~) 0.016s (+1.2%) 1.026s (~) 0.888s 10 1.31x
🌐 Redis Next.js (Turbopack) 0.142s (-1.7%) 1.004s (~) 0.000s (-100.0% 🟢) 1.014s (~) 0.872s 10 1.34x
💻 Local Nitro 0.176s (-2.4%) 0.993s (~) 0.014s (~) 1.021s (~) 0.844s 10 1.67x
🌐 Turso Next.js (Turbopack) 0.491s (-0.9%) 0.964s (+1.0%) 0.000s (+Infinity% 🔺) 1.014s (~) 0.522s 10 4.65x
🌐 MongoDB Next.js (Turbopack) 0.515s (+5.0% 🔺) 0.938s (-1.9%) 0.000s (~) 1.014s (~) 0.499s 10 4.87x
🐘 Postgres Next.js (Turbopack) 0.842s (-3.2%) 1.430s (+45.9% 🔺) 0.000s (-100.0% 🟢) 1.516s (+35.9% 🔺) 0.675s 10 7.95x
🐘 Postgres Nitro 1.151s (-10.7% 🟢) 1.892s (+15.0% 🔺) 0.000s (-100.0% 🟢) 2.013s (+5.3% 🔺) 0.863s 10 10.88x
🐘 Postgres Express 1.263s (-42.8% 🟢) 1.779s (-37.3% 🟢) 0.000s (NaN%) 2.013s (-33.3% 🟢) 0.750s 10 11.94x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.833s (+8.4% 🔺) 3.271s (+5.6% 🔺) 0.548s (+83.7% 🔺) 4.307s (+14.4% 🔺) 1.474s 10 1.00x
▲ Vercel Nitro 2.871s (-35.0% 🟢) 3.275s (-29.0% 🟢) 0.424s (-42.8% 🟢) 4.168s (-29.8% 🟢) 1.297s 10 1.01x
▲ Vercel Next.js (Turbopack) 3.182s (-47.8% 🟢) 3.888s (-31.8% 🟢) 1.409s (+232.0% 🔺) 5.767s (-21.3% 🟢) 2.586s 10 1.12x

🔍 Observability: Express | Nitro | Next.js (Turbopack)

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 7/7
🐘 Postgres Next.js (Turbopack) 5/7
▲ Vercel Nitro 3/7
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 5/7
Next.js (Turbopack) 🌐 Starter 5/7
Nitro 💻 Local 5/7
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
  • 🌐 Starter: Community world (local development)
  • 🌐 Turso: Community world (local development)
  • 🌐 MongoDB: Community world (local development)
  • 🌐 Redis: Community world (local development)
  • 🌐 Jazz: Community world (local development)

📋 View full workflow run

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Dec 16, 2025

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
❌ ▲ Vercel Production 278 8 11 297
✅ 💻 Local Development 262 0 8 270
❌ 📦 Local Production 261 1 8 270
✅ 🐘 Local Postgres 262 0 8 270
✅ 🪟 Windows 27 0 0 27
❌ 🌍 Community Worlds 109 11 0 120
Total 1199 20 35 1254

❌ Failed Tests

▲ Vercel Production (8 failed)

nextjs-turbopack (8 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
📦 Local Production (1 failed)

hono-stable (1 failed):

  • webhookWorkflow
🌍 Community Worlds (11 failed)

mongodb (1 failed):

  • webhookWorkflow

redis (1 failed):

  • webhookWorkflow

starter (8 failed):

  • addTenWorkflow
  • addTenWorkflow
  • retryAttemptCounterWorkflow
  • crossFileErrorWorkflow - stack traces work across imported modules
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step

turso (1 failed):

  • webhookWorkflow

Details by Category

❌ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 26 0 1
✅ example 26 0 1
✅ express 26 0 1
✅ fastify 26 0 1
✅ hono 26 0 1
❌ nextjs-turbopack 18 8 1
✅ nextjs-webpack 26 0 1
✅ nitro 26 0 1
✅ nuxt 26 0 1
✅ sveltekit 26 0 1
✅ vite 26 0 1
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 26 0 1
✅ express-stable 26 0 1
✅ fastify-stable 26 0 1
✅ hono-stable 26 0 1
✅ nextjs-turbopack-stable 27 0 0
✅ nextjs-webpack-stable 27 0 0
✅ nitro-stable 26 0 1
✅ nuxt-stable 26 0 1
✅ sveltekit-stable 26 0 1
✅ vite-stable 26 0 1
❌ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 26 0 1
✅ express-stable 26 0 1
✅ fastify-stable 26 0 1
❌ hono-stable 25 1 1
✅ nextjs-turbopack-stable 27 0 0
✅ nextjs-webpack-stable 27 0 0
✅ nitro-stable 26 0 1
✅ nuxt-stable 26 0 1
✅ sveltekit-stable 26 0 1
✅ vite-stable 26 0 1
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 26 0 1
✅ express-stable 26 0 1
✅ fastify-stable 26 0 1
✅ hono-stable 26 0 1
✅ nextjs-turbopack-stable 27 0 0
✅ nextjs-webpack-stable 27 0 0
✅ nitro-stable 26 0 1
✅ nuxt-stable 26 0 1
✅ sveltekit-stable 26 0 1
✅ vite-stable 26 0 1
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 27 0 0
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 0
❌ mongodb 26 1 0
✅ redis-dev 3 0 0
❌ redis 26 1 0
✅ starter-dev 3 0 0
❌ starter 19 8 0
✅ turso-dev 3 0 0
❌ turso 26 1 0

📋 View full workflow run


Some E2E test jobs failed:

  • Vercel Prod: failure
  • Local Dev: success
  • Local Prod: failure
  • Local Postgres: success
  • Windows: success

Check the workflow run for details.

Comment thread packages/world-local/src/streamer.ts
Comment thread packages/core/src/vm/index.ts Outdated
return array;
}

(g as any).stableUlid = createStableUlid(rng);
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

I don't love this… could we perhaps move this into the Symbol.for('WORKFLOW_CONTEXT') object instead, or maybe its own separate symbol?

@VaguelySerious VaguelySerious merged commit 712f6f8 into main Dec 17, 2025
88 of 90 checks passed
@VaguelySerious VaguelySerious deleted the peter/stream-name-change branch December 17, 2025 19:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants