perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

perf(core): cache port discovery for step invocations - #2996

Merged
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery
Jul 18, 2026
Merged

perf(core): cache port discovery for step invocations#2996
VaguelySerious merged 1 commit into
vercel:mainfrom
joeyhotz:joeyhotz/cache-step-port-discovery

Conversation

@joeyhotz

@joeyhotzjoeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Description

Reuse the process-level getPortLazy() cache from #2522 for self-hosted step invocations. The step handler currently calls getPort() for every step; in a production burst profile, process.report.getReport() beneath that lookup accounted for 83% of peak wall samples.

This is safe because the listening port is stable for the process lifetime, only concrete ports are cached, concurrent first calls are deduplicated, and undefined results retry. The existing Vercel branch still skips discovery.

How did you test your changes?

  • Added a regression test proving two step invocations share one port lookup.
  • pnpm --filter @workflow/core test (1,483 passed; 3 expected failures)
  • pnpm --filter @workflow/core typecheck
  • pnpm turbo build --filter='@workflow/core...'
  • Biome check on the changed TypeScript files

PR Checklist - Required to merge

  • 📦 pnpm changeset was run to create a changelog for this PR
    • correct bump (patch for bug fixes, minor for new features, major for breaking changes)
    • only changed packages included
  • 🔒 DCO sign-off passes (run git commit --signoff)
  • 📝 Ping @vercel/workflow in a comment once PR ready and checklist complete

Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@joeyhotz
joeyhotz requested review from a team and ijjk as code ownersJuly 18, 2026 09:01
@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: f4e31ad

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

This PR includes changesets to release 16 packages
NameType
@workflow/corePatch
@workflow/buildersPatch
@workflow/cliPatch
@workflow/nextPatch
@workflow/nitroPatch
@workflow/vitestPatch
@workflow/web-sharedPatch
@workflow/webPatch
workflowPatch
@workflow/world-testingPatch
@workflow/astroPatch
@workflow/nestPatch
@workflow/nuxtPatch
@workflow/rollupPatch
@workflow/sveltekitPatch
@workflow/vitePatch

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

@joeyhotz

Copy link
Copy Markdown
ContributorAuthor

@vercel/workflow

@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

@joeyhotz is attempting to deploy a commit to the Vercel Labs Team on Vercel.

A member of the Team first needs to authorize it.

@joeyhotz

joeyhotz commented Jul 18, 2026

Copy link
Copy Markdown
ContributorAuthor

Wow guys I'm testing this with a patch, I'm getting huge performance improvements for burst tests I'm doing. Before it was causing requests to not be served (I assume hogged too much of the event loop), but now it doesn't cause requests to not be served, and also goes through the queue looooads faster.

@VaguelySerious

Copy link
Copy Markdown
Member

Great catch!

@VaguelySerious
VaguelySerious merged commit d8071bb into vercel:mainJul 18, 2026
65 of 102 checks passed
@github-actionsgithub-actionsBot mentioned this pull request Jul 18, 2026
github-actionsBot added a commit that referenced this pull request Jul 18, 2026
…worlds (#2996)
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2997. Merge conflicts were resolved by AI — please review carefully. (backport job run)

@joeyhotz

joeyhotz commented Jul 19, 2026

Copy link
Copy Markdown
ContributorAuthor

@VaguelySerious hope it's okay to ask a question, as you know I got a few PRs through recently into the v5 beta, are the beta versions generally stable and usable in production? Or should I avoid? When something gets merged into main, does it instantly increment a version and useable? Honestly these are my first sets of OSS contributions.

@VaguelySerious

Copy link
Copy Markdown
Member

@joeyhotz Anything landing on main will be in a beta release within ~1 week usually, as we do some internal testing first. Some of these changes then get backported to stable after testing, which then gets released ~1-2 weeks later too.

We're hoping to release v5 beta as a stable release soon (weeks?) after we improve performance a bit more. If you pin your prod to the current latest beta release after testing it in preview/staging for a bit, it's unlikely you'll have any negative surprises.

VaguelySerious added a commit that referenced this pull request Jul 20, 2026
…#2997)
Co-authored-by: Joey Hotz <joeyhotz1@gmail.com>
Signed-off-by: Joey Hotz <joeyhotz1@gmail.com>
Co-authored-by: Peter Wielander <peter.wielander@vercel.com>
@github-actionsgithub-actionsBot mentioned this pull request Jul 20, 2026
pranaygp added a commit that referenced this pull request Jul 21, 2026
* origin/main: (21 commits)
docs(agents): note lint/format/typecheck are advisory, not blocking (#2886)
Retry transient connection timeouts (#3013)
fix(world-vercel): append caller User-Agent products instead of discarding them (#2998)
[ci] Enable NestJS e2e-vercel-prod and add to docs as "experimental" (#3011)
[ci] Benchmark comment: Best column + best/p75/p99 deltas (drop Avg/P10) (#3005)
docs: fall back to first child page for sidebar folders without an index (#3009)
[nest] Fix NestJS Vercel build output (#2988)
Avoid resolving run data for background steps (#2993)
chore(docs): update @vercel/geistdocs to 1.14.0 (#3002)
fix(docs): add version-switcher fallback redirects for pages missing in one version (#3003)
ci: update opencode to 1.18.4 and switch backport AI model to claude-fable-5 (#3006)
fix(core): batch stream writes via writeMulti (#2995)
perf(core): cache port discovery in step invocations for self-hosted worlds (#2996)
feat(web-shared): Alt+hover span measurement in the new trace viewer (#2985)
fix(world-postgres): throw EntityConflictError on duplicate run_created (#2983)
[ci] Run benchmarks in-deployment to avoid proxy overhead (#2967)
Enable additional perf optimizations when correctness guarantees are met (#2970)
perf(core): prepare replay payloads concurrently (#2980)
Fix dotted tsconfig alias workflow discovery (#2963)
Adjust helper position on trace viewer (#2968)
...
@github-actionsgithub-actionsBot mentioned this pull request Jul 21, 2026
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.

2 participants

@joeyhotz@VaguelySerious