Skip to content

[web-shared] [cli] Refactor observability data fetching#1261

Merged
VaguelySerious merged 49 commits intomainfrom
peter/v2-api
Mar 10, 2026
Merged

[web-shared] [cli] Refactor observability data fetching#1261
VaguelySerious merged 49 commits intomainfrom
peter/v2-api

Conversation

@VaguelySerious
Copy link
Member

@VaguelySerious VaguelySerious commented Mar 4, 2026

This PR refactors Web UI and CLI to build spans from events instead of fetching steps/hook.

This was a bit hard to do - now that we're loading events sequentially and constructing spans accordingly, we need to cleverly show the expected durations of spans/hooks that might not be resolved until much later. This probably deserves some thorough testing against larger runs.

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
c
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@changeset-bot
Copy link

changeset-bot bot commented Mar 4, 2026

🦋 Changeset detected

Latest commit: 2af0bf5

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

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

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

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

@vercel
Copy link
Contributor

vercel bot commented Mar 4, 2026

@github-actions
Copy link
Contributor

github-actions bot commented Mar 4, 2026

📊 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.033s (+1.9%) 1.006s (~) 0.973s 10 1.00x
💻 Local Nitro 0.033s (-6.5% 🟢) 1.006s (~) 0.973s 10 1.01x
💻 Local Next.js (Turbopack) 0.043s 1.006s 0.963s 10 1.30x
🌐 Redis Next.js (Turbopack) 0.047s 1.005s 0.958s 10 1.44x
🐘 Postgres Next.js (Turbopack) 0.049s 1.011s 0.962s 10 1.50x
🐘 Postgres Express 0.054s (~) 1.012s (~) 0.958s 10 1.66x
🐘 Postgres Nitro 0.057s (+5.5% 🔺) 1.012s (~) 0.954s 10 1.76x
🌐 MongoDB Next.js (Turbopack) 0.101s 1.008s 0.906s 10 3.09x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.426s (-18.2% 🟢) 2.393s (+7.1% 🔺) 1.968s 10 1.00x
▲ Vercel Express 0.536s (+11.1% 🔺) 2.392s (-2.2%) 1.856s 10 1.26x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.100s 2.007s 0.906s 10 1.00x
💻 Local Express 1.101s (~) 2.006s (~) 0.905s 10 1.00x
💻 Local Nitro 1.102s (~) 2.005s (~) 0.903s 10 1.00x
💻 Local Next.js (Turbopack) 1.105s 2.006s 0.902s 10 1.00x
🐘 Postgres Express 1.126s (~) 2.012s (~) 0.886s 10 1.02x
🐘 Postgres Next.js (Turbopack) 1.127s 2.012s 0.884s 10 1.02x
🐘 Postgres Nitro 1.128s (-2.3%) 2.013s (~) 0.885s 10 1.03x
🌐 MongoDB Next.js (Turbopack) 1.300s 2.007s 0.707s 10 1.18x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.024s (~) 3.503s (-4.4%) 1.480s 10 1.00x
▲ Vercel Nitro 2.117s (~) 3.310s (-12.9% 🟢) 1.193s 10 1.05x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 10.678s 11.024s 0.345s 3 1.00x
🌐 Redis Next.js (Turbopack) 10.684s 11.024s 0.340s 3 1.00x
💻 Local Express 10.779s (~) 11.023s (~) 0.244s 3 1.01x
💻 Local Nitro 10.782s (~) 11.023s (~) 0.241s 3 1.01x
🐘 Postgres Next.js (Turbopack) 10.796s 11.042s 0.246s 3 1.01x
🐘 Postgres Express 10.810s (~) 11.046s (~) 0.236s 3 1.01x
🐘 Postgres Nitro 10.835s (-0.6%) 11.045s (~) 0.210s 3 1.01x
🌐 MongoDB Next.js (Turbopack) 12.232s 13.017s 0.785s 3 1.15x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 16.927s (+0.9%) 18.435s (+1.9%) 1.509s 2 1.00x
▲ Vercel Express 16.930s (+1.2%) 18.357s (-1.2%) 1.428s 2 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 26.681s 27.052s 0.371s 3 1.00x
🐘 Postgres Next.js (Turbopack) 26.895s 27.066s 0.171s 3 1.01x
🐘 Postgres Express 26.943s (~) 27.060s (~) 0.117s 3 1.01x
💻 Local Next.js (Turbopack) 27.004s 27.052s 0.049s 3 1.01x
🐘 Postgres Nitro 27.015s (~) 27.402s (+1.2%) 0.387s 3 1.01x
💻 Local Nitro 27.190s (~) 28.053s (~) 0.863s 3 1.02x
💻 Local Express 27.203s (~) 28.052s (~) 0.849s 3 1.02x
🌐 MongoDB Next.js (Turbopack) 30.442s 31.043s 0.601s 2 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 50.316s (+15.5% 🔺) 51.189s (+13.5% 🔺) 0.874s 2 1.00x
▲ Vercel Express 50.510s (+15.6% 🔺) 52.518s (+16.9% 🔺) 2.009s 2 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 53.265s 54.102s 0.837s 2 1.00x
🐘 Postgres Next.js (Turbopack) 53.749s 54.104s 0.355s 2 1.01x
🐘 Postgres Express 53.806s (~) 54.093s (~) 0.287s 2 1.01x
🐘 Postgres Nitro 53.885s (~) 54.110s (~) 0.225s 2 1.01x
💻 Local Next.js (Turbopack) 55.641s 56.102s 0.461s 2 1.04x
💻 Local Nitro 56.096s (~) 56.600s (-0.9%) 0.503s 2 1.05x
💻 Local Express 56.127s (~) 56.602s (+0.9%) 0.475s 2 1.05x
🌐 MongoDB Next.js (Turbopack) 60.537s 61.054s 0.517s 2 1.14x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 96.001s (~) 97.606s (+0.6%) 1.605s 1 1.00x
▲ Vercel Nitro 99.589s (+3.5%) 101.074s (+3.7%) 1.485s 1 1.04x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.291s 2.007s 0.715s 15 1.00x
🐘 Postgres Express 1.344s (-2.3%) 2.011s (~) 0.667s 15 1.04x
🐘 Postgres Nitro 1.365s (-0.9%) 2.011s (~) 0.646s 15 1.06x
🐘 Postgres Next.js (Turbopack) 1.369s 2.011s 0.642s 15 1.06x
💻 Local Next.js (Turbopack) 1.393s 2.005s 0.612s 15 1.08x
💻 Local Express 1.414s (~) 2.006s (~) 0.592s 15 1.09x
💻 Local Nitro 1.414s (-1.3%) 2.006s (~) 0.591s 15 1.10x
🌐 MongoDB Next.js (Turbopack) 2.145s 3.008s 0.863s 10 1.66x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.314s (-7.9% 🟢) 3.521s (-7.6% 🟢) 1.207s 9 1.00x
▲ Vercel Express 2.324s (~) 3.496s (-7.0% 🟢) 1.172s 9 1.00x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Nitro | Express

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Express 2.009s (~) 2.599s (~) 0.590s 12 1.00x
🐘 Postgres Nitro 2.027s (-3.9%) 2.516s (-3.2%) 0.488s 12 1.01x
🐘 Postgres Next.js (Turbopack) 2.045s 2.596s 0.550s 12 1.02x
🌐 Redis Next.js (Turbopack) 2.527s 3.008s 0.481s 10 1.26x
💻 Local Next.js (Turbopack) 2.617s 3.007s 0.390s 10 1.30x
💻 Local Express 2.628s (+2.8%) 3.007s (~) 0.379s 10 1.31x
💻 Local Nitro 2.645s (-0.5%) 3.007s (~) 0.362s 10 1.32x
🌐 MongoDB Next.js (Turbopack) 4.667s 5.177s 0.510s 6 2.32x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.631s (-4.0%) 4.012s (~) 1.382s 8 1.00x
▲ Vercel Nitro 3.145s (+8.1% 🔺) 4.336s (+5.0% 🔺) 1.191s 7 1.20x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 3.715s (-1.3%) 4.467s (~) 0.752s 7 1.00x
🐘 Postgres Express 3.783s (+1.7%) 4.454s (+3.2%) 0.671s 7 1.02x
🐘 Postgres Next.js (Turbopack) 3.840s 4.887s 1.048s 7 1.03x
🌐 Redis Next.js (Turbopack) 4.069s 4.725s 0.656s 7 1.10x
💻 Local Next.js (Turbopack) 7.453s 8.015s 0.562s 4 2.01x
💻 Local Nitro 7.657s (+0.8%) 8.018s (~) 0.360s 4 2.06x
💻 Local Express 7.841s (+2.0%) 8.019s (~) 0.178s 4 2.11x
🌐 MongoDB Next.js (Turbopack) 9.764s 10.353s 0.589s 3 2.63x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.679s (-5.9% 🟢) 3.763s (-2.3%) 1.084s 8 1.00x
▲ Vercel Nitro 3.230s (+11.3% 🔺) 4.360s (+1.0%) 1.129s 7 1.21x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.281s 2.006s 0.726s 15 1.00x
🐘 Postgres Express 1.381s (-1.3%) 2.011s (~) 0.630s 15 1.08x
🐘 Postgres Nitro 1.389s (-0.8%) 2.012s (~) 0.623s 15 1.08x
🐘 Postgres Next.js (Turbopack) 1.408s 2.011s 0.604s 15 1.10x
💻 Local Nitro 1.437s (~) 2.006s (~) 0.569s 15 1.12x
💻 Local Express 1.442s (-1.5%) 2.006s (~) 0.563s 15 1.13x
💻 Local Next.js (Turbopack) 1.475s 2.006s 0.531s 15 1.15x
🌐 MongoDB Next.js (Turbopack) 2.170s 3.009s 0.838s 10 1.69x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.120s (-3.9%) 3.576s (-2.5%) 1.457s 9 1.00x
▲ Vercel Nitro 2.531s (+8.2% 🔺) 3.770s (-4.3%) 1.238s 8 1.19x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 2.059s 2.477s 0.418s 13 1.00x
🐘 Postgres Nitro 2.092s (~) 2.684s (~) 0.593s 12 1.02x
🐘 Postgres Express 2.136s (-4.2%) 2.742s (+2.2%) 0.606s 11 1.04x
🌐 Redis Next.js (Turbopack) 2.514s 3.008s 0.494s 10 1.22x
💻 Local Next.js (Turbopack) 2.680s 3.008s 0.328s 10 1.30x
💻 Local Nitro 2.783s (~) 3.109s (+3.3%) 0.326s 10 1.35x
💻 Local Express 2.825s (+3.3%) 3.009s (~) 0.183s 10 1.37x
🌐 MongoDB Next.js (Turbopack) 4.759s 5.178s 0.419s 6 2.31x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.591s (+15.7% 🔺) 3.996s (+13.0% 🔺) 1.405s 8 1.00x
▲ Vercel Nitro 2.885s (+23.0% 🔺) 4.076s (+9.9% 🔺) 1.191s 8 1.11x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Next.js (Turbopack) 3.688s 4.307s 0.620s 7 1.00x
🐘 Postgres Nitro 3.764s (-0.5%) 4.311s (-6.2% 🟢) 0.547s 7 1.02x
🐘 Postgres Express 3.825s (+2.0%) 4.603s (+3.4%) 0.779s 7 1.04x
🌐 Redis Next.js (Turbopack) 4.105s 4.868s 0.763s 7 1.11x
💻 Local Next.js (Turbopack) 7.463s 7.766s 0.303s 4 2.02x
💻 Local Nitro 8.549s (+3.3%) 9.021s (~) 0.472s 4 2.32x
💻 Local Express 8.630s (+4.8%) 9.026s (~) 0.396s 4 2.34x
🌐 MongoDB Next.js (Turbopack) 9.905s 10.349s 0.444s 3 2.69x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.852s (-4.0%) 4.121s (-4.8%) 1.269s 8 1.00x
▲ Vercel Nitro 3.330s (+7.8% 🔺) 4.510s (+3.5%) 1.180s 7 1.17x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - -

🔍 Observability: Express | Nitro

Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 0.145s 1.002s 0.011s 1.017s 0.872s 10 1.00x
🌐 Redis Next.js (Turbopack) 0.154s 1.000s 0.001s 1.008s 0.853s 10 1.06x
💻 Local Express 0.167s (~) 1.002s (~) 0.011s (~) 1.017s (~) 0.850s 10 1.15x
💻 Local Nitro 0.176s (+2.0%) 1.002s (~) 0.012s (+0.9%) 1.017s (~) 0.841s 10 1.22x
🐘 Postgres Next.js (Turbopack) 0.182s 1.001s 0.001s 1.012s 0.830s 10 1.25x
🐘 Postgres Express 0.186s (-0.6%) 0.998s (~) 0.001s (-7.7% 🟢) 1.012s (~) 0.827s 10 1.28x
🐘 Postgres Nitro 0.193s (-4.9%) 0.993s (~) 0.001s (-13.3% 🟢) 1.012s (~) 0.819s 10 1.33x
🌐 MongoDB Next.js (Turbopack) 0.485s 0.960s 0.002s 1.008s 0.523s 10 3.35x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 1.577s (~) 2.844s (+10.3% 🔺) 0.109s (+2128.6% 🔺) 3.341s (+9.9% 🔺) 1.764s 10 1.00x
▲ Vercel Express 1.589s (-2.2%) 2.291s (-9.6% 🟢) 0.209s (+3564.9% 🔺) 2.955s (-1.2%) 1.367s 10 1.01x
▲ Vercel Next.js (Turbopack) ⚠️ missing - - - - -

🔍 Observability: Nitro | Express

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 6/12
Next.js (Turbopack) 🌐 Redis 5/12
Nitro 🐘 Postgres 6/12
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

@github-actions
Copy link
Contributor

github-actions bot commented Mar 4, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 571 0 67 638
✅ 💻 Local Development 612 0 84 696
✅ 📦 Local Production 612 0 84 696
✅ 🐘 Local Postgres 612 0 84 696
✅ 🪟 Windows 55 0 3 58
❌ 🌍 Community Worlds 118 56 15 189
✅ 📋 Other 147 0 27 174
Total 2727 56 364 3147

❌ Failed Tests

🌍 Community Worlds (56 failed)

mongodb (3 failed):

  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously

redis (2 failed):

  • hookWorkflow is not resumable via public webhook endpoint
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously

turso (51 failed):

  • addTenWorkflow
  • addTenWorkflow
  • wellKnownAgentWorkflow (.well-known/agent)
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • importedStepOnlyWorkflow
  • hookWorkflow
  • hookWorkflow is not resumable via public webhook endpoint
  • webhookWorkflow
  • sleepingWorkflow
  • parallelSleepWorkflow
  • nullByteWorkflow
  • workflowAndStepMetadataWorkflow
  • fetchWorkflow
  • promiseRaceStressTestWorkflow
  • error handling error propagation workflow errors nested function calls preserve message and stack trace
  • error handling error propagation workflow errors cross-file imports preserve message and stack trace
  • error handling error propagation step errors basic step error preserves message and stack trace
  • error handling error propagation step errors cross-file step error preserves message and function names in stack
  • error handling retry behavior regular Error retries until success
  • error handling retry behavior FatalError fails immediately without retries
  • error handling retry behavior RetryableError respects custom retryAfter delay
  • error handling retry behavior maxRetries=0 disables retries
  • error handling retry behavior workflow completes despite transient 5xx on step_completed
  • error handling catchability FatalError can be caught and detected with FatalError.is()
  • hookCleanupTestWorkflow - hook token reuse after workflow completion
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously
  • hookDisposeTestWorkflow - hook token reuse after explicit disposal while workflow still running
  • stepFunctionPassingWorkflow - step function references can be passed as arguments (without closure vars)
  • stepFunctionWithClosureWorkflow - step function with closure variables passed as argument
  • closureVariableWorkflow - nested step functions with closure variables
  • spawnWorkflowFromStepWorkflow - spawning a child workflow using start() inside a step
  • health check (queue-based) - workflow and step endpoints respond to health check messages
  • pathsAliasWorkflow - TypeScript path aliases resolve correctly
  • Calculator.calculate - static workflow method using static step methods from another class
  • AllInOneService.processNumber - static workflow method using sibling static step methods
  • ChainableService.processWithThis - static step methods using this to reference the class
  • thisSerializationWorkflow - step function invoked with .call() and .apply()
  • customSerializationWorkflow - custom class serialization with WORKFLOW_SERIALIZE/WORKFLOW_DESERIALIZE
  • instanceMethodStepWorkflow - instance methods with "use step" directive
  • crossContextSerdeWorkflow - classes defined in step code are deserializable in workflow context
  • stepFunctionAsStartArgWorkflow - step function reference passed as start() argument
  • cancelRun - cancelling a running workflow
  • cancelRun via CLI - cancelling a running workflow
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router
  • hookWithSleepWorkflow - hook payloads delivered correctly with concurrent sleep
  • sleepWithSequentialStepsWorkflow - sequential steps work with concurrent sleep (control)

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 51 0 7
✅ example 51 0 7
✅ express 51 0 7
✅ fastify 51 0 7
✅ hono 51 0 7
✅ nextjs-turbopack 56 0 2
✅ nextjs-webpack 56 0 2
✅ nitro 51 0 7
✅ nuxt 51 0 7
✅ sveltekit 51 0 7
✅ vite 51 0 7
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 49 0 9
✅ express-stable 49 0 9
✅ fastify-stable 49 0 9
✅ hono-stable 49 0 9
✅ nextjs-turbopack-canary 55 0 3
✅ nextjs-turbopack-stable 55 0 3
✅ nextjs-webpack-canary 55 0 3
✅ nextjs-webpack-stable 55 0 3
✅ nitro-stable 49 0 9
✅ nuxt-stable 49 0 9
✅ sveltekit-stable 49 0 9
✅ vite-stable 49 0 9
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 49 0 9
✅ express-stable 49 0 9
✅ fastify-stable 49 0 9
✅ hono-stable 49 0 9
✅ nextjs-turbopack-canary 55 0 3
✅ nextjs-turbopack-stable 55 0 3
✅ nextjs-webpack-canary 55 0 3
✅ nextjs-webpack-stable 55 0 3
✅ nitro-stable 49 0 9
✅ nuxt-stable 49 0 9
✅ sveltekit-stable 49 0 9
✅ vite-stable 49 0 9
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 49 0 9
✅ express-stable 49 0 9
✅ fastify-stable 49 0 9
✅ hono-stable 49 0 9
✅ nextjs-turbopack-canary 55 0 3
✅ nextjs-turbopack-stable 55 0 3
✅ nextjs-webpack-canary 55 0 3
✅ nextjs-webpack-stable 55 0 3
✅ nitro-stable 49 0 9
✅ nuxt-stable 49 0 9
✅ sveltekit-stable 49 0 9
✅ vite-stable 49 0 9
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 55 0 3
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 2
❌ mongodb 52 3 3
✅ redis-dev 3 0 2
❌ redis 53 2 3
✅ turso-dev 3 0 2
❌ turso 4 51 3
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 49 0 9
✅ e2e-local-postgres-nest-stable 49 0 9
✅ e2e-local-prod-nest-stable 49 0 9

📋 View full workflow run

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
- Fetch events with withData:true so stepName, token, resumeAt are available
- Fix sleep span runId extraction from wait entity data in detail panel
Count step_started events as attempts instead of relying on step_retrying.
Clear completedAt on retry/re-start so a retried step doesn't retain stale timestamps.
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
c
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
- Show spinner + 'Loading more events...' while paginating
- Show 'Waiting for more events...' when all pages loaded but run still active
- Render trace viewer immediately when run exists (don't wait for isLoading)
- Add footer prop to TraceViewerTimeline for content below spans in scroll area
Guard buildTrace on run.runId instead of just truthiness, since the
hook returns {} as WorkflowRun before data arrives.
Footer was rendered inside the timeline scroll container's fixed-height
content div, making it invisible. Move to an absolute overlay at the
bottom of the traceViewerContent area with a gradient fade.

Visualize known vs unknown time in trace viewer

- Active child spans (steps/hooks/sleeps without an end event) now cap at
  the latest known event time instead of `now`, so they only extend as far
  as our data goes — even if the run is completed but we haven't loaded all
  events yet.
- buildTrace returns knownDurationMs (time from trace start to latest event).
- Horizontal overlay in the trace viewer covers the region to the right of
  the known time horizon, indicating unloaded data.
- Footer overlay shows 'Loading more events...' or 'Waiting for more events...'
  at the bottom of the timeline.

Fix footer position: anchor to outermost trace viewer container

The footer was inside .traceViewerContent which has a computed height
smaller than the visible area. Moved to be a direct child of .traceViewer
which has position:relative and fills the full visible height.

Show 'End of run' in footer when run is complete and all events loaded

Diagonal stripe pattern for unknown-time overlay

- Black/dark-gray diagonal stripes instead of flat gray
- Offset 5% from the known-time edge so stripes don't touch spans
- CSS mask fades the pattern in from left to right
Footer: move back inside timeline scroll container with min-height
wrapper so it's only visible when scrolled to the bottom, not overlaying
content.

Stripes: use --ds-gray-200/--ds-gray-400 CSS variables so the pattern is
visible on both light and dark themes.
No transparency needed since the overlay fully covers the background.
Uses design system tokens that correctly contrast in both light and dark.
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
VaguelySerious and others added 5 commits March 9, 2026 14:58
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
- Remove leftover 300ms artificial delay in fetchEvents RPC call
- Fix loading state never clearing for hook/sleep resources in
  useWorkflowResourceData (wrap in try/finally)
- Add receivedCount, lastReceivedAt, and disposedAt to AttributePanel
  so the hook detail sidebar shows how often the hook was resolved

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
attribute as keyof typeof attributeToDisplayFn
]?.(displayData[attribute as keyof typeof displayData]);
const isModuleSpecifier = attribute === 'moduleSpecifier';
const shouldCapitalizeLabel = attribute !== 'workflowCoreVersion';
Copy link
Collaborator

Choose a reason for hiding this comment

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

accidental revert?

Copy link
Member Author

Choose a reason for hiding this comment

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

I thought maybe we'd not want to capitalize in general. Will revert, discuss separately

@karthikscale3
Copy link
Collaborator

Tested hook resolution, sleeps, trace viewer pagination on a 200 step run and metadata rendering on the spans. Mostly looks good to me. Only minor nit: we may show a partial step/span at the pagination boundary if events for that step are split between pages - I think we are okay with this for now? We could potentially make the server do some pre-processing of the events list that has no partial events maybe. But we can ITG this.

Signed-off-by: Peter Wielander <mittgfu@gmail.com>
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