') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ', 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); Version Packages (beta) by github-actions[bot] · Pull Request #3028 · vercel/workflow · GitHub
Skip to content

Version Packages (beta) - #3028

Merged
VaguelySerious merged 1 commit into
mainfrom
changeset-release/main
Jul 22, 2026
Merged

Version Packages (beta)#3028
VaguelySerious merged 1 commit into
mainfrom
changeset-release/main

Conversation

@github-actions

@github-actionsgithub-actionsBot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.

⚠️⚠️⚠️⚠️⚠️⚠️

main is currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, run changeset pre exit on main.

⚠️⚠️⚠️⚠️⚠️⚠️

Releases

@workflow/nest@5.0.0-beta.36

Major Changes

  • #2988542138d Thanks @VaguelySerious! - Add workflow-nest build --vercel command for emitting a Vercel Build Output API directory, enabling deployment of NestJS apps on Vercel. Breaking:NestLocalBuilder moved from the package root to the @workflow/nest/builder (workflow/nest/builder) subpath so importing WorkflowModule no longer pulls the build toolchain into the runtime bundle; the new NestVercelBuilder lives at @workflow/nest/vercel-builder (workflow/nest/vercel-builder).

Patch Changes

  • Updated dependencies [927b61a]:
    • @workflow/builders@5.0.0-beta.36

@workflow/core@5.0.0-beta.36

Minor Changes

  • #2865a5e6f11 Thanks @NathanColosimo! - Add experimental_minRetention for keeping a Hook token unavailable after its run ends, and require supporting Worlds to advertise the hookRetention capability.

  • #2946eb8fdb9 Thanks @VaguelySerious! - The WORKFLOW_PRECONDITION_GUARD event-creation guard is now on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0.

Patch Changes

  • #29936d1d700 Thanks @NathanColosimo! - Avoid resolving run data before background step execution.

  • #2996d8071bb Thanks @joeyhotz! - Cache self-hosted step port discovery per process.

  • #2986fe12b84 Thanks @shalabhc! - Enforce a server-supplied per-run event limit (default 25K)

  • #2970bb773e9 Thanks @VaguelySerious! - Keep the inline event-log delta fast path active with open hooks when WORKFLOW_PRECONDITION_GUARD=1 and the World declares capabilities.preconditionGuard. The lazy inline step_started claim now carries the guard snapshot so a stale replay's claim is fenced (412 → fresh replay), and guard-enforced batches with an open hook take the await-then-run path so a fenced claim never executes the step body.

  • #2980268fede Thanks @NathanColosimo! - Prepare encrypted replay payloads concurrently and cache the decrypted, decompressed representation for reuse across inline replay iterations.

  • #30359177ba8 Thanks @VaguelySerious! - Enforce maxRetries for inline and backgrounded steps that time out

  • #29956353c8c Thanks @VaguelySerious! - Fix stream writes never batching: flushablePipe awaited each writer.write() and the WritableStream sink serialized chunks one at a time, so the server writable's buffer never held more than one chunk and its writeMulti batching path never engaged — every chunk became its own server round trip. The server writable now exposes a durable batch write that flushablePipe uses to coalesce chunks arriving while a previous write is in flight into a single writeMulti, while preserving the existing durability guarantees. Coalesced batches are split at chunk-count and byte wire limits (WORKFLOW_STREAM_MAX_CHUNKS_PER_BATCH, WORKFLOW_STREAM_MAX_BYTES_PER_BATCH), independent of the read-ahead backpressure bound (WORKFLOW_STREAM_MAX_INFLIGHT_CHUNKS).

  • Updated dependencies [7d29bab, fe12b84, 6f032d7, a5e6f11, 850777a, 457e671, eb8fdb9, 9078126, 59c1369, bb773e9, 4ecbe7e]:

    • @workflow/world@5.0.0-beta.22
    • @workflow/world-local@5.0.0-beta.30
    • @workflow/world-vercel@5.0.0-beta.32
    • @workflow/errors@5.0.0-beta.12

@workflow/web-shared@5.0.0-beta.36

Minor Changes

  • #2985621b04e Thanks @mitul-s! - Trace viewer: holding Alt with a span selected now measures the time delta between the selected span and any hovered span, Figma-style; the no-selection Alt gap overlay is restyled to the same measurement-line design.

Patch Changes

workflow@5.0.0-beta.36

Minor Changes

  • #2946eb8fdb9 Thanks @VaguelySerious! - The WORKFLOW_PRECONDITION_GUARD event-creation guard is now on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0.

Patch Changes

  • #2980268fede Thanks @NathanColosimo! - Prepare encrypted replay payloads concurrently and cache the decrypted, decompressed representation for reuse across inline replay iterations.

  • Updated dependencies [6d1d700, d8071bb, fe12b84, a5e6f11, bb773e9, 542138d, 268fede, eb8fdb9, 9177ba8, 6353c8c]:

    • @workflow/core@5.0.0-beta.36
    • @workflow/errors@5.0.0-beta.12
    • @workflow/nest@5.0.0-beta.36
    • @workflow/cli@5.0.0-beta.36
    • @workflow/next@5.0.0-beta.36
    • @workflow/nitro@5.0.0-beta.36
    • @workflow/typescript-plugin@5.0.0-beta.5
    • @workflow/astro@5.0.0-beta.36
    • @workflow/nuxt@5.0.0-beta.36
    • @workflow/rollup@5.0.0-beta.36
    • @workflow/sveltekit@5.0.0-beta.36

@workflow/world@5.0.0-beta.22

Minor Changes

  • #29157d29bab Thanks @joeyhotz! - Add runs.getMany() for retrieving ordered workflow run snapshots in one storage operation.

  • #2865a5e6f11 Thanks @NathanColosimo! - Add experimental_minRetention for keeping a Hook token unavailable after its run ends, and require supporting Worlds to advertise the hookRetention capability.

  • #2970bb773e9 Thanks @VaguelySerious! - Add an optional capabilities?: WorldCapabilities field to the World interface so implementations can declare backend feature support (preconditionGuard, maxConcurrency) instead of the runtime inferring it from environment variables; the Vercel World declares both.

Patch Changes

  • #2986fe12b84 Thanks @shalabhc! - Enforce a server-supplied per-run event limit (default 25K)

  • #2946eb8fdb9 Thanks @VaguelySerious! - The WORKFLOW_PRECONDITION_GUARD event-creation guard is now on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0.

@workflow/world-local@5.0.0-beta.30

Minor Changes

  • #29157d29bab Thanks @joeyhotz! - Add runs.getMany() for retrieving ordered workflow run snapshots in one storage operation.

Patch Changes

  • #2987850777a Thanks @VaguelySerious! - Reject hook_received on terminal runs, including when the termination commits concurrently (cross-process) and for legacy (pre-event-sourcing) runs.

  • Updated dependencies [7d29bab, fe12b84, a5e6f11, eb8fdb9, bb773e9]:

    • @workflow/world@5.0.0-beta.22
    • @workflow/errors@5.0.0-beta.12

@workflow/world-postgres@5.0.0-beta.28

Minor Changes

  • #29157d29bab Thanks @joeyhotz! - Add runs.getMany() for retrieving ordered workflow run snapshots in one storage operation.

Patch Changes

  • #2987850777a Thanks @VaguelySerious! - Reject hook_received on terminal runs, including when the termination commits concurrently (cross-process) and for legacy (pre-event-sourcing) runs.

  • #29833ddf42e Thanks @joeyhotz! - Throw EntityConflictError when a run_created event targets a run that already exists, instead of resolving with no run. This matches world-local and world-vercel, and stops start() from throwing Missing 'run' in server response for 'run_created' event when the resilient start path wins the race.

  • Updated dependencies [7d29bab, fe12b84, a5e6f11, 850777a, eb8fdb9, bb773e9]:

    • @workflow/world@5.0.0-beta.22
    • @workflow/world-local@5.0.0-beta.30
    • @workflow/errors@5.0.0-beta.12

@workflow/world-vercel@5.0.0-beta.32

Minor Changes

  • #29157d29bab Thanks @joeyhotz! - Add runs.getMany() for retrieving ordered workflow run snapshots in one storage operation.

  • #2865a5e6f11 Thanks @NathanColosimo! - Add experimental_minRetention for keeping a Hook token unavailable after its run ends, and require supporting Worlds to advertise the hookRetention capability.

Patch Changes

  • #2986fe12b84 Thanks @shalabhc! - Enforce a server-supplied per-run event limit (default 25K)

  • #29516f032d7 Thanks @karthikscale3! - Decode stable-line CBOR structured errors when reading v4 workflow events while preserving current serialized error payloads.

  • #2959457e671 Thanks @alangenfeld! - Log the underlying queue handler error before retrying a failed delivery.

  • #30139078126 Thanks @NathanColosimo! - Retry transient connection timeouts so Eve can resume existing workflow runs after brief network failures.

  • #303859c1369 Thanks @karthikscale3! - Retry stream close on retriable 5xx. Close is idempotent on the server (unlike chunk appends, which keep their no-5xx retry policy), and the server may return retriable 503s expecting the writer to close again.

  • #2970bb773e9 Thanks @VaguelySerious! - Add an optional capabilities?: WorldCapabilities field to the World interface so implementations can declare backend feature support (preconditionGuard, maxConcurrency) instead of the runtime inferring it from environment variables; the Vercel World declares both.

  • #29984ecbe7e Thanks @ruiconti! - Append caller-provided user-agent tokens to the world-vercel user-agent instead of discarding them.

  • Updated dependencies [7d29bab, fe12b84, a5e6f11, eb8fdb9, bb773e9]:

    • @workflow/world@5.0.0-beta.22
    • @workflow/errors@5.0.0-beta.12

@workflow/astro@5.0.0-beta.36

Patch Changes

  • Updated dependencies [927b61a]:
    • @workflow/builders@5.0.0-beta.36
    • @workflow/rollup@5.0.0-beta.36
    • @workflow/vite@5.0.0-beta.36

@workflow/builders@5.0.0-beta.36

Patch Changes

@workflow/cli@5.0.0-beta.36

Patch Changes

@workflow/errors@5.0.0-beta.12

Patch Changes

  • #2986fe12b84 Thanks @shalabhc! - Enforce a server-supplied per-run event limit (default 25K)

  • #2946eb8fdb9 Thanks @VaguelySerious! - The WORKFLOW_PRECONDITION_GUARD event-creation guard is now on by default; opt out with WORKFLOW_PRECONDITION_GUARD=0.

@workflow/next@5.0.0-beta.36

Patch Changes

@workflow/nitro@5.0.0-beta.36

Patch Changes

@workflow/nuxt@5.0.0-beta.36

Patch Changes

  • Updated dependencies [927b61a]:
    • @workflow/builders@5.0.0-beta.36
    • @workflow/nitro@5.0.0-beta.36

@workflow/rollup@5.0.0-beta.36

Patch Changes

  • Updated dependencies [927b61a]:
    • @workflow/builders@5.0.0-beta.36

@workflow/sveltekit@5.0.0-beta.36

Patch Changes

  • Updated dependencies [927b61a]:
    • @workflow/builders@5.0.0-beta.36
    • @workflow/rollup@5.0.0-beta.36
    • @workflow/vite@5.0.0-beta.36

@workflow/vite@5.0.0-beta.36

Patch Changes

  • Updated dependencies [927b61a]:
    • @workflow/builders@5.0.0-beta.36

@workflow/vitest@5.0.0-beta.36

Patch Changes

@workflow/web@5.0.0-beta.36

Patch Changes

  • Updated dependencies [7d29bab, 850777a]:
    • @workflow/world-local@5.0.0-beta.30

@workflow/world-testing@5.0.0-beta.36

Patch Changes

@github-actions
github-actionsBot requested review from a team and ijjk as code ownersJuly 21, 2026 11:22
@vercel

vercelBot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

@github-actions
github-actionsBotforce-pushed the changeset-release/main branch from d4cd9d4 to eb8fdb9CompareJuly 21, 2026 17:20
@github-actionsgithub-actionsBot reopened this Jul 21, 2026
@github-actions
github-actionsBotforce-pushed the changeset-release/main branch from bd02acd to 850777aCompareJuly 21, 2026 21:37
@github-actionsgithub-actionsBot reopened this Jul 21, 2026
@github-actions

github-actionsBot commented Jul 22, 2026

Copy link
Copy Markdown
ContributorAuthor

📊 Workflow Benchmarks

commit b300451 · Wed, 22 Jul 2026 03:53:53 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep150 (+23%) 🔻328 🔴 (+37%) 🔻443 🔴 (+36%) 🔻3242 🔴 (+652%) 🔻30
TTFSstream169 (+9.0%)347 🔴 (+2.4%)537 🔴 (+46%) 🔻2663 🔴 (+475%) 🔻30
TTFShook + stream272 (-12%)588 🔴 (+27%) 🔻853 🔴 (+68%) 🔻2668 🔴 (+330%) 🔻30
STSO1020 steps (1-20)191 (+0.5%)331 🔴 (+13%)594 🔴 (+76%) 🔻731 🔴 (+109%) 🔻19
STSO1020 steps (101-120)270 (+21%) 🔻352 🔴 (+9.7%)434 🔴 (-10%)579 🔴 (+16%) 🔻19
STSO1020 steps (1001-1020)688 (+14%)871 🔴 (+11%)1021 🔴 (+17%) 🔻1040 🔴 (-5.9%)19
WO1020 steps637563 (+21%) 🔻637563 (+21%) 🔻637563 (+21%) 🔻637563 (+21%) 🔻1
SLstream latency83 (-7.8%)169 🔴 (+13%)186 🔴 (+2.8%)361 🔴 (+58%) 🔻30

Best/P75/P90/P99 deltas compare against the most recent benchmark run on main at the time of this run. 🔻 flags a delta worse than +15%, 💚 one better than −15%.

Metrics — TTFS: time to first step body (in-deployment start() → first step body, deployment clocks) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · SL: stream latency (in-deployment write → read propagation, readAt - writtenAt)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · stream latency: parallel reader/writer steps on a dedicated stream; SL is the in-deployment write->read propagation (readAt - writtenAt)

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600 · SL 50/60/125 · STSO (1-20) 20/30/60 · STSO (101-120) 30/45/90 · STSO (1001-1020) 40/60/120

All metrics are measured from deployment-side timestamps only. Runs are triggered by an in-deployment route that stamps the anchor (clientStart) right before start(), so the CI runner’s request and its path through api.vercel.com sit outside every measured window. TTFS = in-deployment start() → first step body (turbo uses the in-process fast path, non-turbo the dispatch path), and includes the VQS dispatch hop plus any /flow cold start. STSO/WO are measured between step bodies on the deployment. SL is measured inside the workflow (parallel reader/writer steps), so it no longer includes the api.vercel.com read path.

Cold starts are kept in the numbers on purpose — they are part of real bursty-workload latency. The workbench deployment cold-starts the /flow invocation for a large fraction of runs, inflating P75+; the Best column shows the fastest (warm-start) sample for comparison.

@github-actions

github-actionsBot commented Jul 22, 2026

Copy link
Copy Markdown
ContributorAuthor

🧪 E2E Test Results

Some tests failed

Summary

PassedFailedSkippedTotal
❌ ▲ Vercel Production144872391694
❌ 💻 Local Development162012271848
✅ 📦 Local Production162102271848
✅ 🐘 Local Postgres162102271848
✅ 🪟 Windows15400154
✅ 📋 Other102002121232
✅ vercel-multi-region270027
Total7511811328651

❌ Failed Tests

▲ Vercel Production (7 failed)

hono (3 failed):

nitro (4 failed):

💻 Local Development (1 failed)

nuxt-stable (1 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41KY3YT4VV0GQEZZ0JMMF97Y1W

Details by Category

❌ ▲ Vercel Production
AppPassedFailedSkipped
✅ astro126028
✅ example126028
✅ express126028
✅ fastify126028
❌ hono123328
✅ nextjs-turbopack15103
✅ nextjs-webpack15103
❌ nitro122428
✅ nuxt126028
✅ sveltekit14509
✅ vite126028
❌ 💻 Local Development
AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
❌ nuxt-stable127126
✅ sveltekit-stable14707
✅ vite-stable128026
✅ 📦 Local Production
AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026
✅ 🐘 Local Postgres
AppPassedFailedSkipped
✅ astro-stable128026
✅ express-stable128026
✅ fastify-stable128026
✅ hono-stable128026
✅ nextjs-turbopack-canary135019
✅ nextjs-turbopack-stable15400
✅ nextjs-webpack-canary135019
✅ nextjs-webpack-stable15400
✅ nitro-stable128026
✅ nuxt-stable128026
✅ sveltekit-stable14707
✅ vite-stable128026
✅ 🪟 Windows
AppPassedFailedSkipped
✅ nextjs-turbopack15400
✅ 📋 Other
AppPassedFailedSkipped
✅ e2e-local-dev-nest-stable128026
✅ e2e-local-dev-tanstack-start-128026
✅ e2e-local-postgres-nest-stable128026
✅ e2e-local-postgres-tanstack-start-128026
✅ e2e-local-prod-nest-stable128026
✅ e2e-local-prod-tanstack-start-128026
✅ e2e-vercel-prod-nest126028
✅ e2e-vercel-prod-tanstack-start126028
✅ vercel-multi-region
AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run


Some E2E test jobs failed:

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

Check the workflow run for details.

@github-actions

Copy link
Copy Markdown
ContributorAuthor

No backport to stable for 1225258 (AI decision).

This is a changesets "Version Packages (beta)" release commit that only bumps pre-release versions and updates CHANGELOGs/.changeset/pre.json. Version bump commits and similar release plumbing are explicitly excluded from backporting; stable has its own independent release/versioning flow.

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

1225258b5da66be40749c17d12c4e24d32197aa2

Sign up for freeto 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.

1 participant

@VaguelySerious