Skip to content

Attributes MVP (experimental and write-only) and CI hardening#2134

Merged
pranaygp merged 2 commits into
mainfrom
peter/fix-large-inline-sourcemap-remap
May 28, 2026
Merged

Attributes MVP (experimental and write-only) and CI hardening#2134
pranaygp merged 2 commits into
mainfrom
peter/fix-large-inline-sourcemap-remap

Conversation

@VaguelySerious
Copy link
Copy Markdown
Member

@VaguelySerious VaguelySerious commented May 28, 2026

Includes all of #2088

and additionally fixes nextjs-webpack errors surfaced by doing:

  • replace workflow error remapping's inline sourcemap regex with string scanning
  • add regression coverage so large inline sourcemap bundles do not invoke the regex path
  • add a core changeset

@changeset-bot
Copy link
Copy Markdown

changeset-bot Bot commented May 28, 2026

🦋 Changeset detected

Latest commit: 606af96

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

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

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

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

@vercel
Copy link
Copy Markdown
Contributor

vercel Bot commented May 28, 2026

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

Project Deployment Actions Updated (UTC)
example-nextjs-workflow-turbopack Ready Ready Preview, Comment May 28, 2026 4:48pm
example-nextjs-workflow-webpack Ready Ready Preview, Comment May 28, 2026 4:48pm
example-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-astro-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-express-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-fastify-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-hono-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-nitro-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-nuxt-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-sveltekit-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-tanstack-start-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workbench-vite-workflow Ready Ready Preview, Comment May 28, 2026 4:48pm
workflow-docs Ready Ready Preview, Comment, Open in v0 May 28, 2026 4:48pm
workflow-swc-playground Ready Ready Preview, Comment May 28, 2026 4:48pm
workflow-tarballs Ready Ready Preview, Comment May 28, 2026 4:48pm
workflow-web Ready Ready Preview, Comment May 28, 2026 4:48pm

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 28, 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.042s (-4.3%) 1.005s (~) 0.963s 10 1.00x
💻 Local Nitro 0.044s (+1.6%) 1.005s (~) 0.961s 10 1.03x
🐘 Postgres Express 0.060s (+3.3%) 1.013s (~) 0.953s 10 1.41x
🐘 Postgres Nitro 0.062s (-34.5% 🟢) 1.012s (-3.0%) 0.950s 10 1.47x
💻 Local Next.js (Turbopack) 0.065s 1.006s 0.941s 10 1.52x
🐘 Postgres Next.js (Turbopack) 0.068s 1.012s 0.944s 10 1.60x
workflow with 1 step

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.089s (-3.3%) 2.006s (~) 0.917s 10 1.00x
💻 Local Nitro 1.100s (-2.7%) 2.006s (~) 0.906s 10 1.01x
🐘 Postgres Express 1.109s (-3.3%) 2.010s (~) 0.901s 10 1.02x
🐘 Postgres Nitro 1.111s (-2.5%) 2.010s (~) 0.899s 10 1.02x
💻 Local Next.js (Turbopack) 1.126s 2.006s 0.880s 10 1.03x
🐘 Postgres Next.js (Turbopack) 1.140s 2.008s 0.868s 10 1.05x
workflow with 10 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 10.495s (-3.9%) 11.021s (~) 0.526s 3 1.00x
🐘 Postgres Nitro 10.537s (-3.1%) 11.019s (~) 0.482s 3 1.00x
💻 Local Nitro 10.544s (-3.7%) 11.024s (~) 0.480s 3 1.00x
🐘 Postgres Express 10.560s (-3.7%) 11.013s (~) 0.454s 3 1.01x
💻 Local Next.js (Turbopack) 10.778s 11.023s 0.245s 3 1.03x
🐘 Postgres Next.js (Turbopack) 10.782s 11.018s 0.236s 3 1.03x
workflow with 25 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 13.682s (-8.6% 🟢) 14.026s (-6.7% 🟢) 0.345s 5 1.00x
🐘 Postgres Nitro 13.734s (-5.9% 🟢) 14.019s (-6.7% 🟢) 0.285s 5 1.00x
🐘 Postgres Express 13.847s (-5.0% 🟢) 14.021s (-6.7% 🟢) 0.174s 5 1.01x
💻 Local Nitro 13.866s (-7.9% 🟢) 14.026s (-12.5% 🟢) 0.160s 5 1.01x
💻 Local Next.js (Turbopack) 14.329s 15.030s 0.701s 4 1.05x
🐘 Postgres Next.js (Turbopack) 14.399s 15.014s 0.616s 4 1.05x
workflow with 50 sequential steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 12.360s (-25.5% 🟢) 13.024s (-23.5% 🟢) 0.664s 7 1.00x
💻 Local Nitro 12.512s (-25.4% 🟢) 13.026s (-23.5% 🟢) 0.514s 7 1.01x
🐘 Postgres Nitro 12.552s (-10.1% 🟢) 13.020s (-9.0% 🟢) 0.468s 7 1.02x
🐘 Postgres Express 12.820s (-8.5% 🟢) 13.164s (-9.8% 🟢) 0.344s 7 1.04x
💻 Local Next.js (Turbopack) 13.578s 14.025s 0.447s 7 1.10x
🐘 Postgres Next.js (Turbopack) 13.607s 14.018s 0.411s 7 1.10x
Promise.all with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.185s (-7.1% 🟢) 2.008s (~) 0.823s 15 1.00x
💻 Local Express 1.186s (-20.4% 🟢) 2.005s (~) 0.820s 15 1.00x
🐘 Postgres Express 1.192s (-5.4% 🟢) 2.008s (~) 0.816s 15 1.01x
💻 Local Nitro 1.214s (-25.6% 🟢) 2.006s (-3.3%) 0.792s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.222s 2.007s 0.784s 15 1.03x
💻 Local Next.js (Turbopack) 1.332s 2.005s 0.673s 15 1.12x
Promise.all with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.247s (-47.0% 🟢) 2.008s (-33.3% 🟢) 0.761s 15 1.00x
🐘 Postgres Express 1.264s (-46.5% 🟢) 2.009s (-33.2% 🟢) 0.745s 15 1.01x
🐘 Postgres Next.js (Turbopack) 1.381s 2.007s 0.626s 15 1.11x
💻 Local Nitro 1.651s (-47.5% 🟢) 2.006s (-48.4% 🟢) 0.354s 15 1.32x
💻 Local Express 1.722s (-41.7% 🟢) 2.005s (-41.9% 🟢) 0.283s 15 1.38x
💻 Local Next.js (Turbopack) 1.863s 2.006s 0.143s 15 1.49x
Promise.all with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.373s (-60.5% 🟢) 2.008s (-49.9% 🟢) 0.634s 15 1.00x
🐘 Postgres Express 1.407s (-59.6% 🟢) 2.008s (-49.9% 🟢) 0.600s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.734s 2.223s 0.489s 14 1.26x
💻 Local Express 4.768s (-42.8% 🟢) 5.346s (-40.8% 🟢) 0.579s 6 3.47x
💻 Local Nitro 4.806s (-42.4% 🟢) 5.345s (-40.7% 🟢) 0.539s 6 3.50x
💻 Local Next.js (Turbopack) 5.709s 6.214s 0.505s 5 4.16x
Promise.race with 10 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.182s (-6.0% 🟢) 2.008s (~) 0.826s 15 1.00x
🐘 Postgres Express 1.187s (-5.6% 🟢) 2.009s (~) 0.822s 15 1.00x
🐘 Postgres Next.js (Turbopack) 1.225s 2.009s 0.784s 15 1.04x
💻 Local Next.js (Turbopack) 1.383s 2.006s 0.623s 15 1.17x
💻 Local Express 1.529s (-19.3% 🟢) 2.007s (-15.1% 🟢) 0.478s 15 1.29x
💻 Local Nitro 1.976s (+5.9% 🔺) 2.391s (+2.2%) 0.416s 13 1.67x
Promise.race with 25 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.234s (-47.3% 🟢) 2.008s (-33.3% 🟢) 0.774s 15 1.00x
🐘 Postgres Express 1.266s (-45.9% 🟢) 2.008s (-33.3% 🟢) 0.742s 15 1.03x
🐘 Postgres Next.js (Turbopack) 1.363s 2.006s 0.644s 15 1.10x
💻 Local Nitro 1.729s (-43.6% 🟢) 2.008s (-48.3% 🟢) 0.280s 15 1.40x
💻 Local Express 1.962s (-37.4% 🟢) 2.316s (-38.4% 🟢) 0.354s 13 1.59x
💻 Local Next.js (Turbopack) 2.054s 2.507s 0.453s 12 1.66x
Promise.race with 50 concurrent steps

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.367s (-60.7% 🟢) 2.008s (-49.9% 🟢) 0.641s 15 1.00x
🐘 Postgres Express 1.398s (-60.0% 🟢) 2.008s (-49.9% 🟢) 0.610s 15 1.02x
🐘 Postgres Next.js (Turbopack) 1.685s 2.145s 0.460s 15 1.23x
💻 Local Nitro 4.761s (-47.9% 🟢) 5.346s (-46.7% 🟢) 0.585s 6 3.48x
💻 Local Next.js (Turbopack) 5.478s 6.215s 0.737s 5 4.01x
💻 Local Express 5.671s (-35.6% 🟢) 6.414s (-30.8% 🟢) 0.743s 5 4.15x
workflow with 10 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.543s (-33.8% 🟢) 1.007s (~) 0.464s 60 1.00x
🐘 Postgres Express 0.579s (-31.0% 🟢) 1.007s (-1.6%) 0.428s 60 1.07x
💻 Local Express 0.597s (-39.4% 🟢) 1.005s (-6.6% 🟢) 0.408s 60 1.10x
💻 Local Nitro 0.643s (-34.4% 🟢) 1.039s (-5.0% 🟢) 0.396s 58 1.18x
🐘 Postgres Next.js (Turbopack) 0.805s 1.024s 0.219s 59 1.48x
💻 Local Next.js (Turbopack) 0.933s 1.095s 0.163s 55 1.72x
workflow with 25 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.364s (-29.2% 🟢) 2.031s (-3.3%) 0.667s 45 1.00x
🐘 Postgres Express 1.391s (-29.6% 🟢) 2.030s (-10.1% 🟢) 0.640s 45 1.02x
💻 Local Nitro 1.522s (-49.9% 🟢) 2.006s (-46.6% 🟢) 0.484s 45 1.12x
💻 Local Express 1.634s (-45.8% 🟢) 2.122s (-40.8% 🟢) 0.489s 43 1.20x
🐘 Postgres Next.js (Turbopack) 1.891s 2.029s 0.138s 45 1.39x
💻 Local Next.js (Turbopack) 2.053s 2.734s 0.681s 33 1.50x
workflow with 50 sequential data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 2.704s (-34.1% 🟢) 3.085s (-33.0% 🟢) 0.381s 39 1.00x
🐘 Postgres Express 2.727s (-31.7% 🟢) 3.137s (-28.2% 🟢) 0.410s 39 1.01x
💻 Local Express 3.175s (-65.5% 🟢) 4.009s (-60.0% 🟢) 0.834s 30 1.17x
💻 Local Nitro 3.252s (-65.0% 🟢) 4.009s (-60.0% 🟢) 0.757s 30 1.20x
🐘 Postgres Next.js (Turbopack) 3.743s 4.042s 0.299s 30 1.38x
💻 Local Next.js (Turbopack) 4.274s 5.010s 0.736s 24 1.58x
workflow with 10 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.218s (-23.0% 🟢) 1.006s (~) 0.788s 60 1.00x
🐘 Postgres Express 0.226s (-19.8% 🟢) 1.006s (~) 0.780s 60 1.04x
🐘 Postgres Next.js (Turbopack) 0.277s 1.006s 0.729s 60 1.27x
💻 Local Express 0.401s (-28.4% 🟢) 1.004s (~) 0.603s 60 1.84x
💻 Local Nitro 0.445s (-26.3% 🟢) 1.004s (-1.7%) 0.559s 60 2.04x
💻 Local Next.js (Turbopack) 0.596s 1.039s 0.443s 58 2.73x
workflow with 25 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.351s (-29.3% 🟢) 1.006s (~) 0.655s 90 1.00x
🐘 Postgres Express 0.353s (-30.8% 🟢) 1.006s (~) 0.653s 90 1.01x
🐘 Postgres Next.js (Turbopack) 0.473s 1.006s 0.533s 90 1.35x
💻 Local Express 2.037s (-19.0% 🟢) 2.580s (-14.3% 🟢) 0.543s 35 5.80x
💻 Local Nitro 2.130s (-16.1% 🟢) 2.766s (-8.1% 🟢) 0.636s 33 6.07x
💻 Local Next.js (Turbopack) 2.296s 3.077s 0.781s 30 6.54x
workflow with 50 concurrent data payload steps (10KB)

💻 Local Development

World Framework Workflow Time Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.678s (-14.2% 🟢) 1.006s (~) 0.329s 120 1.00x
🐘 Postgres Express 0.715s (-12.6% 🟢) 1.006s (-1.1%) 0.291s 120 1.06x
🐘 Postgres Next.js (Turbopack) 0.964s 1.508s 0.543s 80 1.42x
💻 Local Nitro 9.308s (-16.8% 🟢) 9.872s (-15.4% 🟢) 0.564s 13 13.73x
💻 Local Express 9.466s (-15.4% 🟢) 10.111s (-15.3% 🟢) 0.646s 12 13.96x
💻 Local Next.js (Turbopack) 10.478s 11.299s 0.821s 11 15.46x
Stream Benchmarks (includes TTFB metrics)
workflow with stream

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.159s (+482.0% 🔺) 2.005s (+99.6% 🔺) 0.012s (-1.7%) 2.019s (+98.3% 🔺) 0.860s 10 1.00x
💻 Local Nitro 1.159s (+442.5% 🔺) 2.006s (+99.7% 🔺) 0.013s (+7.2% 🔺) 2.022s (+98.4% 🔺) 0.862s 10 1.00x
🐘 Postgres Nitro 1.160s (+465.9% 🔺) 1.998s (+99.9% 🔺) 0.001s (-33.3% 🟢) 2.009s (+98.7% 🔺) 0.849s 10 1.00x
🐘 Postgres Express 1.176s (+473.5% 🔺) 1.997s (+100.0% 🔺) 0.001s (-18.8% 🟢) 2.010s (+98.8% 🔺) 0.834s 10 1.02x
💻 Local Next.js (Turbopack) 1.208s 2.004s 0.013s 2.020s 0.812s 10 1.04x
🐘 Postgres Next.js (Turbopack) 1.230s 2.001s 0.001s 2.009s 0.779s 10 1.06x
stream pipeline with 5 transform steps (1MB)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
💻 Local 🥇 Express 1.581s (+108.8% 🔺) 2.012s (+95.5% 🔺) 0.009s (-9.4% 🟢) 2.022s (+94.5% 🔺) 0.441s 30 1.00x
🐘 Postgres Nitro 1.583s (+153.6% 🔺) 2.002s (+98.9% 🔺) 0.004s (-6.5% 🟢) 2.026s (+98.1% 🔺) 0.443s 30 1.00x
💻 Local Nitro 1.597s (+90.4% 🔺) 2.011s (+98.8% 🔺) 0.010s (+8.5% 🔺) 2.024s (+81.3% 🔺) 0.427s 30 1.01x
🐘 Postgres Express 1.606s (+154.9% 🔺) 2.006s (+99.3% 🔺) 0.004s (+1.8%) 2.025s (+97.9% 🔺) 0.419s 30 1.02x
🐘 Postgres Next.js (Turbopack) 1.723s 2.010s 0.004s 2.025s 0.301s 30 1.09x
💻 Local Next.js (Turbopack) 1.734s 2.044s 0.011s 2.057s 0.323s 30 1.10x
10 parallel streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 0.704s (-27.4% 🟢) 1.015s (-18.6% 🟢) 0.000s (-100.0% 🟢) 1.024s (-18.6% 🟢) 0.321s 59 1.00x
🐘 Postgres Express 0.706s (-26.5% 🟢) 1.014s (-20.6% 🟢) 0.000s (+16.9% 🔺) 1.026s (-21.5% 🟢) 0.319s 59 1.00x
🐘 Postgres Next.js (Turbopack) 0.838s 1.052s 0.000s 1.060s 0.221s 57 1.19x
💻 Local Express 1.413s (+15.4% 🔺) 2.015s (~) 0.000s (-60.0% 🟢) 2.017s (~) 0.603s 30 2.01x
💻 Local Nitro 1.469s (+20.2% 🔺) 2.014s (~) 0.000s (+66.7% 🔺) 2.016s (~) 0.547s 30 2.09x
💻 Local Next.js (Turbopack) 1.492s 2.014s 0.000s 2.017s 0.525s 30 2.12x
fan-out fan-in 10 streams (1MB each)

💻 Local Development

World Framework Workflow Time TTFB Slurp Wall Time Overhead Samples vs Fastest
🐘 Postgres 🥇 Nitro 1.285s (-28.3% 🟢) 2.067s (-3.5%) 0.000s (+93.1% 🔺) 2.108s (-3.1%) 0.823s 29 1.00x
🐘 Postgres Express 1.374s (-22.5% 🟢) 2.068s (-5.0% 🟢) 0.000s (+Infinity% 🔺) 2.096s (-4.7%) 0.722s 29 1.07x
🐘 Postgres Next.js (Turbopack) 1.812s 2.350s 0.000s 2.392s 0.580s 26 1.41x
💻 Local Express 3.165s (-8.7% 🟢) 3.843s (-4.7%) 0.001s (-29.7% 🟢) 3.846s (-4.7%) 0.681s 16 2.46x
💻 Local Next.js (Turbopack) 3.200s 3.778s 0.000s 3.782s 0.581s 16 2.49x
💻 Local Nitro 3.307s (-2.4%) 3.769s (-6.5% 🟢) 0.001s (+75.8% 🔺) 3.785s (-6.2% 🟢) 0.478s 16 2.57x

Summary

Fastest Framework by World

Winner determined by most benchmark wins

World 🥇 Fastest Framework Wins
💻 Local Express 15/21
🐘 Postgres Nitro 19/21
Fastest World by Framework

Winner determined by most benchmark wins

Framework 🥇 Fastest World Wins
Express 🐘 Postgres 13/21
Next.js (Turbopack) 🐘 Postgres 15/21
Nitro 🐘 Postgres 17/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)
  • 🌐 Redis: Community world (local development)
  • 🌐 Redis + BullMQ: Community world (local development)
  • 🌐 Cloudflare: Community world (local development)
  • 🌐 MySQL: Community world (local development)
  • 🌐 Azure: Community world (local development)
  • 🌐 NATS JetStream: Community world (local development)
  • 🌐 Upstash: 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
Copy link
Copy Markdown
Contributor

github-actions Bot commented May 28, 2026

🧪 E2E Test Results

All tests passed

Summary

Passed Failed Skipped Total
✅ ▲ Vercel Production 1255 0 219 1474
✅ 💻 Local Development 1657 0 219 1876
✅ 📦 Local Production 1657 0 219 1876
✅ 🐘 Local Postgres 1657 0 219 1876
✅ 🪟 Windows 134 0 0 134
✅ 📋 Other 762 0 176 938
Total 7122 0 1052 8174

Details by Category

✅ ▲ Vercel Production
App Passed Failed Skipped
✅ astro 108 0 26
✅ example 108 0 26
✅ express 108 0 26
✅ fastify 108 0 26
✅ hono 108 0 26
✅ nextjs-turbopack 132 0 2
✅ nextjs-webpack 132 0 2
✅ nitro 108 0 26
✅ nuxt 108 0 26
✅ sveltekit 127 0 7
✅ vite 108 0 26
✅ 💻 Local Development
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 📦 Local Production
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 🐘 Local Postgres
App Passed Failed Skipped
✅ astro-stable 109 0 25
✅ express-stable 109 0 25
✅ fastify-stable 109 0 25
✅ hono-stable 109 0 25
✅ nextjs-turbopack-canary 115 0 19
✅ nextjs-turbopack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-turbopack-stable-lazy-discovery-enabled 134 0 0
✅ nextjs-webpack-canary 115 0 19
✅ nextjs-webpack-stable-lazy-discovery-disabled 134 0 0
✅ nextjs-webpack-stable-lazy-discovery-enabled 134 0 0
✅ nitro-stable 109 0 25
✅ nuxt-stable 109 0 25
✅ sveltekit-stable 128 0 6
✅ vite-stable 109 0 25
✅ 🪟 Windows
App Passed Failed Skipped
✅ nextjs-turbopack 134 0 0
✅ 📋 Other
App Passed Failed Skipped
✅ e2e-local-dev-nest-stable 109 0 25
✅ e2e-local-dev-tanstack-start- 109 0 25
✅ e2e-local-postgres-nest-stable 109 0 25
✅ e2e-local-postgres-tanstack-start- 109 0 25
✅ e2e-local-prod-nest-stable 109 0 25
✅ e2e-local-prod-tanstack-start- 109 0 25
✅ e2e-vercel-prod-tanstack-start 108 0 26

📋 View full workflow run

@VaguelySerious VaguelySerious marked this pull request as ready for review May 28, 2026 11:18
@VaguelySerious VaguelySerious requested a review from a team as a code owner May 28, 2026 11:18
@VaguelySerious VaguelySerious enabled auto-merge (squash) May 28, 2026 11:20
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.

Approve — this is exactly the fix the PR #2088 review flagged

I'd called out the Maximum call stack size exceeded regression on PR #2088 and noted that Peter's earlier attempt (930886fe3 fix(next): replace base64 sourcemap regex with string scan on the attributes-mvp-plan branch) targeted the wrong file — builder-deferred.ts. The actual failing path was workflow-handler error stack remapping in source-map.ts, which uses an independent copy of the same regex. This PR fixes the right file.

Diagnosis confirmed

The original regex:

workflowCode.match(/\/\/# sourceMappingURL=data:application\/json;base64,(.+)/)

The (.+) greedy capture against multi-MB base64 payloads is what triggers V8's irregexp recursion stack overflow. Same root cause as the matchAll regex Peter previously hit in the deferred-entries discoverer.

What I verified locally

  • pnpm turbo run build --filter @workflow/core
  • pnpm --filter @workflow/core test ✓ (1024 pass — 1 new, 1023 existing)
  • pnpm --filter @workflow/core exec vitest run src/source-map.test.ts
  • Manual smoke test of 5 edge cases against the built artifact:
    • Happy path with valid map ✓
    • 1MB padding (would crash the regex) ✓
    • No-map case returns original stack ✓
    • data:application/json;charset=utf-8;base64,… parameter handling ✓
    • Comma-before-;base64, correctly bails ✓

Bonus: the new scanner is strictly more permissive than the old regex

The old regex required the data URL to be exactly data:application/json;base64,… — no parameters allowed ((.+) would never match if e.g. ;charset=utf-8; appeared between json and ;base64,). The new scanner searches for ;base64, after the prefix, so it also handles data:application/json;charset=utf-8;base64,… correctly. So this isn't just a stack-overflow fix — it also extends remapping to data URLs that were silently skipped before.

Test design

The test is good:

const match = vi.spyOn(String.prototype, 'match');
remapErrorStack(...);
expect(
  match.mock.calls.some(([pattern]) =>
    String(pattern).includes('sourceMappingURL')
  )
).toBe(false);

Enforcing the regex is NEVER called on the bundle is the right invariant — it documents that the implementation has moved off the regex path entirely, and would fail if someone accidentally regressed to match. The 1MB padding setup is enough to actually trigger the V8 stack overflow if the regex came back.

Small observation (not a blocker)

The implementation duplicates the same pattern Peter has in packages/next/src/builder-deferred.ts:956 (or had on the attributes-mvp-plan branch). If a third place ever needs to scan inline base64 sourcemaps, worth extracting extractInlineSourceMapBase64() + isBase64Char() to a shared util. Not needed now — two callsites doesn't justify the extraction overhead.

CI

No failures so far on the run (mostly in-progress), and most importantly the local test passes. Once the in-progress nextjs-webpack Local Dev jobs land green, this confirms the fix for the regression I flagged on PR #2088.

Approving.

@pranaygp pranaygp disabled auto-merge May 28, 2026 17:42
@pranaygp pranaygp enabled auto-merge (squash) May 28, 2026 17:43
@pranaygp pranaygp merged commit 1e6b1fd into main May 28, 2026
181 of 191 checks passed
@pranaygp pranaygp deleted the peter/fix-large-inline-sourcemap-remap branch May 28, 2026 18:06
@github-actions
Copy link
Copy Markdown
Contributor

No backport to stable for 1e6b1fd (AI decision).

This commit bundles the Attributes MVP — a new experimental v5-targeted feature with cross-package API additions (new experimental_setAttributes SDK export, new optional experimentalSetAttributes method on the World interface, a new Postgres migration adding an attributes JSONB column, new wire endpoint in world-vercel, schema changes to WorkflowRunBaseSchema, and v5 changelog docs) — alongside a small inline-sourcemap regex hardening fix. The dominant change is a deliberate v5 feature addition (documented under docs/content/docs/v5/changelog/) that should not land on the v4 stable branch. The embedded sourcemap fix could be cherry-picked separately if desired, but backporting this combined commit would inappropriately add the experimental Attributes API to the GA branch.

To override, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

1e6b1fdea2010c1f55b3e6fb5386d436c4406eb4

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants