Skip to content

[builders][web-shared] Improvements to o11y and fixes to graph generation code path#1031

Merged
karthikscale3 merged 21 commits intomainfrom
karthik/o11y-improvements-main-sync
Feb 13, 2026
Merged

[builders][web-shared] Improvements to o11y and fixes to graph generation code path#1031
karthikscale3 merged 21 commits intomainfrom
karthik/o11y-improvements-main-sync

Conversation

@karthikscale3
Copy link
Copy Markdown
Collaborator

Summary

  • Redesign observability UI: Rewrite event list view, workflow trace view, stream viewer, and run detail view with improved span rendering (new span-content, span-segments, span-strategies modules)
  • Align design tokens: Replace shadcn tokens with Geist tokens across shared components
  • Fix Graph generation code path

Test plan

  • Verify web dashboard loads and renders run list correctly
  • Verify run detail view displays trace, events, and streams tabs
  • Verify trace viewer span rendering and interactions (click, expand, zoom)
  • Verify stream viewer displays streaming data
  • Verify hook resolution modal works
  • Verify workflow graph execution viewer still functions with manifest changes

…hanges

Rebase the branch intent onto latest main by preserving web-shared UI refactors and builders base-builder updates while taking main for hydration and data-fetching behavior elsewhere.

Co-authored-by: Cursor <cursoragent@cursor.com>
@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Feb 13, 2026

🦋 Changeset detected

Latest commit: 6c8b089

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

This PR includes changesets to release 15 packages
Name Type
@workflow/web-shared Patch
@workflow/web Patch
@workflow/builders Patch
@workflow/core Patch
@workflow/cli Patch
@workflow/astro Patch
@workflow/nest Patch
@workflow/next Patch
@workflow/nitro Patch
@workflow/rollup Patch
@workflow/sveltekit Patch
@workflow/vite Patch
workflow Patch
@workflow/world-testing 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
Copy Markdown
Contributor

vercel bot commented Feb 13, 2026

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Feb 13, 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.032s (+15.2% 🔺) 1.005s (~) 0.973s 10 1.00x
💻 Local Nitro 0.032s (-0.6%) 1.005s (~) 0.973s 10 1.01x
🌐 Redis Next.js (Turbopack) 0.044s 1.005s 0.961s 10 1.38x
💻 Local Next.js (Turbopack) 0.046s 1.005s 0.959s 10 1.45x
🌐 MongoDB Next.js (Turbopack) 0.073s 1.007s 0.934s 10 2.29x
🐘 Postgres Express 0.098s (+7.7% 🔺) 1.010s (~) 0.911s 10 3.09x
🐘 Postgres Nitro 0.110s (-47.7% 🟢) 1.013s (~) 0.903s 10 3.47x
🐘 Postgres Next.js (Turbopack) 0.340s 1.009s 0.669s 10 10.70x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 0.527s (-12.2% 🟢) 1.727s (-13.4% 🟢) 1.200s 10 1.00x
▲ Vercel Express 0.596s (-20.7% 🟢) 1.995s (-2.1%) 1.399s 10 1.13x
▲ Vercel Next.js (Turbopack) 0.616s (-10.7% 🟢) 2.012s (-6.0% 🟢) 1.396s 10 1.17x

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

workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Next.js (Turbopack) 1.103s 2.005s 0.901s 10 1.00x
💻 Local Nitro 1.104s (~) 2.006s (~) 0.902s 10 1.00x
💻 Local Express 1.105s (+2.4%) 2.006s (~) 0.901s 10 1.00x
🌐 Redis Next.js (Turbopack) 1.108s 2.006s 0.899s 10 1.00x
🌐 MongoDB Next.js (Turbopack) 1.300s 2.007s 0.707s 10 1.18x
🐘 Postgres Next.js (Turbopack) 1.737s 2.012s 0.274s 10 1.57x
🐘 Postgres Nitro 2.390s (-2.0%) 3.014s (~) 0.625s 10 2.17x
🐘 Postgres Express 2.471s (~) 3.014s (~) 0.543s 10 2.24x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.264s (-8.7% 🟢) 3.412s (-2.1%) 1.148s 10 1.00x
▲ Vercel Express 2.394s (~) 3.289s (+4.5%) 0.895s 10 1.06x
▲ Vercel Next.js (Turbopack) 2.416s (-7.0% 🟢) 3.321s (-3.2%) 0.905s 10 1.07x

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

workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 10.737s 11.022s 0.285s 3 1.00x
💻 Local Next.js (Turbopack) 10.756s 11.023s 0.267s 3 1.00x
💻 Local Nitro 10.825s (~) 11.024s (~) 0.198s 3 1.01x
💻 Local Express 10.836s (+2.4%) 11.023s (~) 0.187s 3 1.01x
🌐 MongoDB Next.js (Turbopack) 12.195s 13.019s 0.824s 3 1.14x
🐘 Postgres Next.js (Turbopack) 15.121s 16.045s 0.924s 2 1.41x
🐘 Postgres Express 20.337s (~) 21.061s (~) 0.724s 2 1.89x
🐘 Postgres Nitro 20.357s (~) 21.056s (~) 0.699s 2 1.90x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 17.352s (-5.5% 🟢) 18.417s (-6.0% 🟢) 1.064s 2 1.00x
▲ Vercel Express 18.918s (+3.0%) 20.312s (+2.7%) 1.394s 2 1.09x
▲ Vercel Next.js (Turbopack) 19.299s (+1.8%) 22.589s (+11.6% 🔺) 3.290s 2 1.11x

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

workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 26.898s 27.052s 0.154s 3 1.00x
💻 Local Next.js (Turbopack) 27.234s 28.052s 0.819s 3 1.01x
💻 Local Nitro 27.464s (~) 28.051s (~) 0.587s 3 1.02x
💻 Local Express 27.525s (+2.4%) 28.053s (+3.7%) 0.528s 3 1.02x
🌐 MongoDB Next.js (Turbopack) 30.427s 31.040s 0.613s 2 1.13x
🐘 Postgres Next.js (Turbopack) 37.571s 38.091s 0.520s 2 1.40x
🐘 Postgres Nitro 49.139s (-2.5%) 49.619s (-3.0%) 0.480s 2 1.83x
🐘 Postgres Express 50.328s (~) 51.133s (+1.0%) 0.804s 2 1.87x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 45.407s (+1.3%) 46.539s (+1.0%) 1.132s 2 1.00x
▲ Vercel Next.js (Turbopack) 46.899s (+3.4%) 48.106s (+4.1%) 1.207s 2 1.03x
▲ Vercel Nitro 47.762s (+8.5% 🔺) 48.751s (+7.3% 🔺) 0.989s 2 1.05x

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

workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 54.425s 55.098s 0.674s 2 1.00x
💻 Local Next.js (Turbopack) 56.959s 57.100s 0.141s 2 1.05x
💻 Local Nitro 57.238s (~) 58.101s (~) 0.863s 2 1.05x
💻 Local Express 57.317s (+2.3%) 58.105s (+3.6%) 0.788s 2 1.05x
🌐 MongoDB Next.js (Turbopack) 60.788s 61.070s 0.282s 2 1.12x
🐘 Postgres Nitro 74.803s (-25.5% 🟢) 75.668s (-25.3% 🟢) 0.864s 2 1.37x
🐘 Postgres Express 75.639s (-24.5% 🟢) 76.166s (-24.0% 🟢) 0.527s 2 1.39x
🐘 Postgres Next.js (Turbopack) 77.574s 78.180s 0.606s 2 1.43x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 91.181s (+1.5%) 92.034s (+1.0%) 0.853s 1 1.00x
▲ Vercel Next.js (Turbopack) 91.765s (-0.7%) 93.336s (~) 1.571s 1 1.01x
▲ Vercel Nitro 94.401s (+4.8%) 95.727s (+4.4%) 1.326s 1 1.04x

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

Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 1.241s 2.006s 0.766s 15 1.00x
💻 Local Nitro 1.408s (~) 2.006s (~) 0.598s 15 1.13x
💻 Local Express 1.420s (+3.5%) 2.006s (~) 0.586s 15 1.14x
💻 Local Next.js (Turbopack) 1.422s 2.005s 0.583s 15 1.15x
🐘 Postgres Express 2.044s (-8.5% 🟢) 2.832s (-6.0% 🟢) 0.788s 11 1.65x
🐘 Postgres Nitro 2.095s (-13.2% 🟢) 2.831s (-6.1% 🟢) 0.736s 11 1.69x
🌐 MongoDB Next.js (Turbopack) 2.144s 3.007s 0.863s 10 1.73x
🐘 Postgres Next.js (Turbopack) 2.248s 2.679s 0.430s 12 1.81x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.540s (-1.1%) 3.529s (+2.1%) 0.989s 9 1.00x
▲ Vercel Next.js (Turbopack) 2.627s (-14.6% 🟢) 3.400s (-18.2% 🟢) 0.773s 10 1.03x
▲ Vercel Nitro 3.055s (+18.8% 🔺) 3.914s (+14.3% 🔺) 0.859s 8 1.20x

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

Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 2.524s 3.008s 0.483s 10 1.00x
💻 Local Nitro 2.563s (-2.1%) 3.007s (~) 0.444s 10 1.02x
💻 Local Express 2.607s (+11.1% 🔺) 3.007s (~) 0.400s 10 1.03x
💻 Local Next.js (Turbopack) 2.653s 3.007s 0.354s 10 1.05x
🌐 MongoDB Next.js (Turbopack) 4.654s 5.177s 0.523s 6 1.84x
🐘 Postgres Express 8.499s (-3.2%) 9.032s (-2.8%) 0.533s 4 3.37x
🐘 Postgres Next.js (Turbopack) 9.787s 10.365s 0.578s 3 3.88x
🐘 Postgres Nitro 12.240s (+28.2% 🔺) 12.702s (+26.5% 🔺) 0.463s 3 4.85x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Express 2.651s (-9.2% 🟢) 3.411s (-12.7% 🟢) 0.760s 9 1.00x
▲ Vercel Nitro 2.696s (-33.3% 🟢) 3.380s (-36.8% 🟢) 0.684s 9 1.02x
▲ Vercel Next.js (Turbopack) 5.152s (+87.8% 🔺) 6.263s (+72.3% 🔺) 1.111s 5 1.94x

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

Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 4.090s 5.010s 0.920s 6 1.00x
💻 Local Next.js (Turbopack) 7.516s 7.764s 0.248s 4 1.84x
💻 Local Express 7.649s (+18.1% 🔺) 8.019s (+14.3% 🔺) 0.370s 4 1.87x
💻 Local Nitro 7.790s (+4.7%) 8.269s (+3.1%) 0.479s 4 1.90x
🌐 MongoDB Next.js (Turbopack) 10.014s 10.348s 0.334s 3 2.45x
🐘 Postgres Express 50.095s (+6.8% 🔺) 51.121s (+8.5% 🔺) 1.026s 1 12.25x
🐘 Postgres Nitro 51.731s (+12.6% 🔺) 52.124s (+13.0% 🔺) 0.393s 1 12.65x
🐘 Postgres Next.js (Turbopack) 51.945s 52.124s 0.179s 1 12.70x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 5.306s (+26.7% 🔺) 6.439s (+23.3% 🔺) 1.133s 5 1.00x
▲ Vercel Express 7.262s (+99.2% 🔺) 8.305s (+78.2% 🔺) 1.043s 4 1.37x
▲ Vercel Nitro 7.986s (+96.1% 🔺) 8.821s (+71.1% 🔺) 0.835s 4 1.51x

🔍 Observability: Next.js (Turbopack) | 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.248s 2.006s 0.758s 15 1.00x
💻 Local Nitro 1.445s (+2.8%) 2.005s (~) 0.561s 15 1.16x
💻 Local Express 1.447s (+5.5% 🔺) 2.005s (~) 0.558s 15 1.16x
💻 Local Next.js (Turbopack) 1.457s 2.006s 0.549s 15 1.17x
🐘 Postgres Express 1.863s (-14.5% 🟢) 2.154s (-21.4% 🟢) 0.291s 14 1.49x
🌐 MongoDB Next.js (Turbopack) 2.137s 3.008s 0.871s 10 1.71x
🐘 Postgres Nitro 2.148s (+18.7% 🔺) 2.741s (+14.1% 🔺) 0.593s 11 1.72x
🐘 Postgres Next.js (Turbopack) 2.223s 2.831s 0.609s 11 1.78x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 2.394s (-2.2%) 3.173s (-9.1% 🟢) 0.779s 10 1.00x
▲ Vercel Nitro 2.790s (+16.5% 🔺) 3.437s (+1.9%) 0.648s 9 1.17x
▲ Vercel Express 3.431s (+17.9% 🔺) 4.352s (+14.1% 🔺) 0.921s 7 1.43x

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

Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 2.526s 3.008s 0.482s 10 1.00x
💻 Local Nitro 2.707s (~) 3.007s (~) 0.300s 10 1.07x
💻 Local Express 2.716s (+9.4% 🔺) 3.007s (~) 0.291s 10 1.08x
💻 Local Next.js (Turbopack) 2.794s 3.008s 0.213s 10 1.11x
🌐 MongoDB Next.js (Turbopack) 4.735s 5.175s 0.440s 6 1.87x
🐘 Postgres Express 10.564s (-14.0% 🟢) 11.039s (-10.8% 🟢) 0.475s 3 4.18x
🐘 Postgres Nitro 11.347s (~) 11.697s (-2.8%) 0.350s 3 4.49x
🐘 Postgres Next.js (Turbopack) 13.445s 14.034s 0.589s 3 5.32x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Next.js (Turbopack) 3.404s (+17.9% 🔺) 4.622s (+20.4% 🔺) 1.218s 7 1.00x
▲ Vercel Express 3.447s (+15.0% 🔺) 4.412s (+16.2% 🔺) 0.965s 8 1.01x
▲ Vercel Nitro 3.548s (+45.4% 🔺) 4.396s (+33.7% 🔺) 0.848s 7 1.04x

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

Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🌐 Redis 🥇 Next.js (Turbopack) 4.157s 5.011s 0.854s 6 1.00x
💻 Local Nitro 7.919s (~) 8.269s (~) 0.350s 4 1.90x
💻 Local Express 8.004s (+10.3% 🔺) 8.773s (+9.4% 🔺) 0.768s 4 1.93x
💻 Local Next.js (Turbopack) 8.794s 9.519s 0.725s 4 2.12x
🌐 MongoDB Next.js (Turbopack) 9.882s 10.345s 0.464s 3 2.38x
🐘 Postgres Express 49.624s (+0.7%) 50.098s (~) 0.474s 1 11.94x
🐘 Postgres Nitro 50.268s (+2.4%) 51.112s (+2.0%) 0.844s 1 12.09x
🐘 Postgres Next.js (Turbopack) 53.949s 54.118s 0.169s 1 12.98x

▲ Production (Vercel)

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 5.312s (-26.2% 🟢) 6.474s (-24.2% 🟢) 1.162s 5 1.00x
▲ Vercel Next.js (Turbopack) 6.777s (-6.1% 🟢) 7.910s (-7.6% 🟢) 1.133s 4 1.28x
▲ Vercel Express 6.796s (+55.4% 🔺) 7.827s (+42.9% 🔺) 1.031s 5 1.28x

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

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.149s 1.001s 0.011s 1.017s 0.868s 10 1.00x
🌐 Redis Next.js (Turbopack) 0.151s 1.000s 0.001s 1.007s 0.856s 10 1.02x
💻 Local Nitro 0.172s (-0.7%) 1.003s (~) 0.011s (+4.7%) 1.017s (~) 0.844s 10 1.16x
💻 Local Express 0.177s (+53.4% 🔺) 1.003s (~) 0.011s (-0.9%) 1.016s (~) 0.840s 10 1.19x
🌐 MongoDB Next.js (Turbopack) 0.517s 0.928s 0.002s 1.008s 0.491s 10 3.48x
🐘 Postgres Next.js (Turbopack) 1.212s 1.264s 0.001s 1.612s 0.400s 10 8.15x
🐘 Postgres Express 1.275s (-44.4% 🟢) 1.836s (-33.3% 🟢) 0.002s (+7.1% 🔺) 2.013s (-33.3% 🟢) 0.738s 10 8.58x
🐘 Postgres Nitro 1.400s (-42.9% 🟢) 1.633s (-36.9% 🟢) 0.001s (~) 2.012s (-33.3% 🟢) 0.612s 10 9.42x

▲ Production (Vercel)

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
▲ Vercel 🥇 Nitro 2.040s (-4.4%) 2.407s (-8.7% 🟢) 0.312s (+22.9% 🔺) 3.235s (-6.1% 🟢) 1.195s 10 1.00x
▲ Vercel Express 2.106s (-3.2%) 2.633s (-5.7% 🟢) 0.264s (-4.9%) 3.497s (-4.9%) 1.391s 10 1.03x
▲ Vercel Next.js (Turbopack) 2.179s (-7.8% 🟢) 2.672s (~) 0.316s (+17.5% 🔺) 3.571s (-0.6%) 1.392s 10 1.07x

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

Summary

Fastest Framework by World

Winner determined by most benchmark wins

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

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 💻 Local 10/12
Next.js (Turbopack) 🌐 Redis 10/12
Nitro 💻 Local 11/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
Copy Markdown
Contributor

github-actions bot commented Feb 13, 2026

🧪 E2E Test Results

Some tests failed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 501 0 38 539
✅ 💻 Local Development 520 0 68 588
✅ 📦 Local Production 520 0 68 588
✅ 🐘 Local Postgres 520 0 68 588
✅ 🪟 Windows 46 0 3 49
❌ 🌍 Community Worlds 105 42 9 156
✅ 📋 Other 126 0 21 147
Total 2338 42 275 2655

❌ Failed Tests

🌍 Community Worlds (42 failed)

turso (42 failed):

  • addTenWorkflow
  • addTenWorkflow
  • should work with react rendering in step
  • promiseAllWorkflow
  • promiseRaceWorkflow
  • promiseAnyWorkflow
  • hookWorkflow
  • webhookWorkflow
  • sleepingWorkflow
  • 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
  • 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
  • pages router addTenWorkflow via pages router
  • pages router promiseAllWorkflow via pages router
  • pages router sleepingWorkflow via pages router

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 45 0 4
✅ example 45 0 4
✅ express 45 0 4
✅ fastify 45 0 4
✅ hono 45 0 4
✅ nextjs-turbopack 48 0 1
✅ nextjs-webpack 48 0 1
✅ nitro 45 0 4
✅ nuxt 45 0 4
✅ sveltekit 45 0 4
✅ vite 45 0 4
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 42 0 7
✅ express-stable 42 0 7
✅ fastify-stable 42 0 7
✅ hono-stable 42 0 7
✅ nextjs-turbopack-canary 46 0 3
✅ nextjs-turbopack-stable 46 0 3
✅ nextjs-webpack-canary 46 0 3
✅ nextjs-webpack-stable 46 0 3
✅ nitro-stable 42 0 7
✅ nuxt-stable 42 0 7
✅ sveltekit-stable 42 0 7
✅ vite-stable 42 0 7
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 42 0 7
✅ express-stable 42 0 7
✅ fastify-stable 42 0 7
✅ hono-stable 42 0 7
✅ nextjs-turbopack-canary 46 0 3
✅ nextjs-turbopack-stable 46 0 3
✅ nextjs-webpack-canary 46 0 3
✅ nextjs-webpack-stable 46 0 3
✅ nitro-stable 42 0 7
✅ nuxt-stable 42 0 7
✅ sveltekit-stable 42 0 7
✅ vite-stable 42 0 7
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 42 0 7
✅ express-stable 42 0 7
✅ fastify-stable 42 0 7
✅ hono-stable 42 0 7
✅ nextjs-turbopack-canary 46 0 3
✅ nextjs-turbopack-stable 46 0 3
✅ nextjs-webpack-canary 46 0 3
✅ nextjs-webpack-stable 46 0 3
✅ nitro-stable 42 0 7
✅ nuxt-stable 42 0 7
✅ sveltekit-stable 42 0 7
✅ vite-stable 42 0 7
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 46 0 3
❌ 🌍 Community Worlds
App Passed Failed Skipped
✅ mongodb-dev 3 0 0
✅ mongodb 46 0 3
✅ redis-dev 3 0 0
✅ redis 46 0 3
✅ turso-dev 3 0 0
❌ turso 4 42 3
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 42 0 7
✅ e2e-local-postgres-nest-stable 42 0 7
✅ e2e-local-prod-nest-stable 42 0 7

📋 View full workflow run

Revert the hydration reviver delta for URL, URLSearchParams, and Headers so web-shared matches main behavior while keeping the targeted UI/builders-only scope on this branch.

Co-authored-by: Cursor <cursoragent@cursor.com>
Bring the web-shared trace/detail panel files back in sync with main so PR #1017 behavior is preserved and not regressed on this branch.

Co-authored-by: Cursor <cursoragent@cursor.com>
> = {};
if (!workflows) return result;

// Build a normalized lookup for graphs since the graph extractor uses
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.

Just noting that this probably can go away after #902 is merged.

@TooTallNate
Copy link
Copy Markdown
Member

Code Review

The core logic changes (builders graph path normalization, serialization hydration) are solid. The UI rewrite is a large but cohesive redesign. No blockers, but a few items worth flagging.


Bugs Worth Fixing

1. Stale closure in getMenuItemsworkflow-trace-view.tsx:517-526
spanLookup is missing from the useCallback dependency array for getMenuItems. The function reads spanLookup.get(menu.spanId) but won't see updated spans if the trace data changes. This means context menu actions (resolve hook, cancel run, wake sleep) could operate on stale span data.

2. Inline style vs Tailwind conflictevent-list-view.tsx:389-393
BUTTON_RESET_STYLE sets padding: 0 inline, but the CopyableCell button also has Tailwind class p-0.5. Inline wins, so the padding is effectively zero. Either remove the Tailwind class or remove padding: 0 from the reset style. Same issue at PayloadBlock (~line 481).

3. AbortController signal not wired to fetchuse-stream-reader.ts:127
The abort controller is created and .abort() is called on cleanup, but the signal is never passed to the actual readStream fetch call. This means navigating away from a stream doesn't actually cancel the in-flight HTTP connection — it just suppresses state updates via the mounted flag.


Medium Issues (Non-Blocking)

4. Missing CSS variablestrace-viewer.module.css references --ds-pink-* tokens (for .color4 spans) and legacy --accents-* / --geist-background tokens (for zoom controls, buttons) that are not defined in globals.css. They exist in the new styles.css fallback file, so this may work if both are imported, but if only globals.css is loaded, those UI elements will have invisible/transparent styling.

5. overscan={200} on Virtuosoevent-list-view.tsx:1061
An overscan of 200 items largely defeats the purpose of virtualization. Typical values are 5-20. For a run with hundreds of events this will render nearly all of them regardless.

6. navigator.platform is deprecatedresolve-hook-modal.tsx:293
Used for detecting macOS keyboard shortcuts. Should be migrated to navigator.userAgentData?.platform or a UA string check, but browsers still support it for now.


Minor / Informational

  • Dead code: getSpanClassName in node.tsx:37-49 is exported but never imported. computeBoundaries() and EVENT_LABELS in span-segments.ts are computed but never consumed.
  • Prop mutation during render: node.tsx:139 (node.ref = ref) and node.tsx:298 (event.ref = ref) mutate the span/event objects during render to attach refs. Works but is a React anti-pattern.
  • Division by zero edge case: node.tsx:383(event.timestamp - node.startTime) / node.duration will produce NaN when duration is 0 (instantaneous spans).
  • setTimeout without cleanup: CopyableCell and PayloadBlock use setTimeout for the "Copied" state reset without clearing on unmount.
  • O(n²) buffer copy in use-stream-reader.ts:78-82 — creates a new Uint8Array and copies the full buffer on every chunk. Fine for small streams, could be slow for high-throughput ones.

What Looks Good

  • Graph path normalization in base-builder.ts — Clean two-tier lookup with correct regex patterns.
  • Serialization hydration — New output, metadata, payload hydration follows existing patterns exactly, with proper tests.
  • Event list redesign — The tree gutter, group selection/hover highlighting, and duration display are well thought out.
  • ErrorBoundary refactor — Cleaner API, properly handles non-Error thrown values.

Items 1-3 are worth fixing before merge; the rest are fine as follow-ups.

Copy link
Copy Markdown
Member

@TooTallNate TooTallNate left a comment

Choose a reason for hiding this comment

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

All review items from my earlier pass have been addressed in the latest commit. LGTM.

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