Skip to content

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
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;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[docs] Add "Step executed multiple times" error page by VaguelySerious · Pull Request #2310 · vercel/workflow · GitHub
Skip to content

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

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

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

@VaguelySerious@TooTallNate
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', '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('^' + ".*" + ' [docs] Add "Step executed multiple times" error page by VaguelySerious · Pull Request #2310 · vercel/workflow · GitHub
Skip to content

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

@VaguelySerious@TooTallNate
, '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" + ' [docs] Add "Step executed multiple times" error page by VaguelySerious · Pull Request #2310 · vercel/workflow · GitHub
Skip to content

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

@VaguelySerious@TooTallNate
, '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('^' + ".*" + ' [docs] Add "Step executed multiple times" error page by VaguelySerious · Pull Request #2310 · vercel/workflow · GitHub
Skip to content

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

@VaguelySerious@TooTallNate
, '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); } })(); })(); [docs] Add "Step executed multiple times" error page by VaguelySerious · Pull Request #2310 · vercel/workflow · GitHub
Skip to content

[docs] Add "Step executed multiple times" error page - #2310

Merged
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times
Jun 10, 2026
Merged

[docs] Add "Step executed multiple times" error page#2310
VaguelySerious merged 1 commit into
mainfrom
peter/docs-step-executed-multiple-times

Conversation

@VaguelySerious

@VaguelySeriousVaguelySerious commented Jun 9, 2026

Copy link
Copy Markdown
Member

Preview link

Adds a new troubleshooting page, "Step executed multiple times", to both the v4 and v5 docs. It explains why a workflow run might show multiple step_started events for the same step

Document duplicate step_started events caused by function crashes
(timeouts, OOMs, network issues) for both v4 and v5 docs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@VaguelySerious
VaguelySerious requested a review from a team as a code ownerJune 9, 2026 19:42
@vercel

vercelBot commented Jun 9, 2026

Copy link
Copy Markdown
Contributor

@changeset-bot

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 6b93afc

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

This PR includes changesets to release 0 packages

When changesets are added to this PR, you'll see the packages that this PR includes changesets for and the associated semver types

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

@TooTallNateTooTallNate left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Approve — accurate, well-scoped troubleshooting page

Clean docs-only addition. The new "Step executed multiple times" page correctly explains a real behavior: when a step's function invocation hard-crashes (timeout / OOM / network) after the step_started event is recorded but before it can write a terminal step_completed/step_failed event, the queue redelivers the message and executeStep runs again, producing another step_started for the same correlationId. The result is N step_started events with no visible error — exactly what the page describes.

I traced this through packages/core/src/runtime/step-executor.ts:143 (step_started is created at the top of executeStep, terminal events are written only after the function returns). The "no error visible in the Observability UI" framing is accurate for the SIGKILL paths (OOM/timeout) where the runtime never gets to call dehydrateStepError.

What I checked

  • Content parity: v4 and v5 pages are byte-identical, which is correct here — the behavior is the same on both channels.
  • Link targets resolve (both v4 and v5):
    • prerequisites: /docs/foundations/workflows-and-steps
    • related: /docs/observabilityobservability/index.mdx
    • related: /docs/foundations/errors-and-retries
  • Two observability links are intentional and distinct: line 13 links the workflow SDK's own /docs/observability ("Observability UI"); line 18 links Vercel's product docs https://vercel.com/docs/observability for the Function Invocation Peak Memory metric (a Vercel platform feature, not an SDK feature). Both correct.
  • Index card placed next to step-not-registered — a sensible thematic grouping (the list isn't strictly alphabetical anyway; newer entries are appended).
  • Changeset is the empty ---\n--- form, correct for docs-only changes (docs/ is in changeset ignore).
  • CI: mergeable: MERGEABLE; test matrix is correctly skipped by path filters; BLOCKED is just the required E2E check sitting in skipped/pending, normal for docs PRs. Branch is based on the recent Version Packages (beta) commit, not stale.

One non-blocking observation

Every other page in errors/ uses the kebab-case error code as its title (step-not-registered, corrupted-event-log, replay-divergence, …) and matching card titles, because each corresponds to an actual runtime error name. This page uses prose (Step executed multiple times) in both the frontmatter title and the index card. That's defensible — there is no StepExecutedMultipleTimesError; this is a behavioral troubleshooting topic rather than a named error — so the prose title is arguably more honest. Just flagging the convention divergence in case you'd prefer consistency (e.g. a kebab title with a friendly summary). Not a blocker either way.

LGTM.

@VaguelySerious
VaguelySerious merged commit b549342 into mainJun 10, 2026
58 checks passed
@VaguelySerious
VaguelySerious deleted the peter/docs-step-executed-multiple-times branch June 10, 2026 18:37
github-actionsBot added a commit that referenced this pull request Jun 10, 2026
Signed-off-by: Peter Wielander <mittgfu@gmail.com>
@github-actions

Copy link
Copy Markdown
Contributor

Backport PR opened against stable: #2333. (backport job run)

pranaygp added a commit that referenced this pull request Jun 11, 2026
…-attributes-client
* origin/main: (32 commits)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
[world-vercel] Validate ref resolve responses before use (#2035)
fix: bump devalue to 5.8.1 (#2292)
Handle lazy stream key request failures (#2257)
fix(docs): declare Nitro auto-import globals for code samples (#2290)
[core] Preserve event-log order in hook-vs-sleep replay races (#2171) (#2185)
docs: add nitro changelog (#2232)
fix(next): always apply turbopack content condition regardless of builder mode (#2253)
Update @vercel/queue from 0.2.1 to 0.3.0 (#2255)
[nest] Use AST-based CommonJS import rewriting (#2080)
...
# Conflicts:
#	packages/world-local/src/storage/events-storage.ts
VaguelySerious added a commit that referenced this pull request Jun 11, 2026
Co-authored-by: Peter Wielander <mittgfu@gmail.com>
pranaygp added a commit that referenced this pull request Jun 11, 2026
…hook-ready
* origin-https/main: (119 commits)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
Patch vulnerable package dependencies (#2301)
Deprecate DurableAgent and update it with WorkflowAgent in v5 docs (#2285)
[codex] Fix partial world-local exclusive writes (#2296)
...
# Conflicts:
#	packages/core/src/runtime.ts
#	packages/core/src/runtime/suspension-handler.ts
pranaygp added a commit that referenced this pull request Jun 11, 2026
…docs-run-idempotency
* origin-https/main: (115 commits)
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
Version Packages (beta) (#2254)
...
# Conflicts:
#	docs/content/docs/v4/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/advanced/child-workflows.mdx
#	docs/content/docs/v5/cookbook/agent-patterns/durable-agent.mdx
pranaygp added a commit that referenced this pull request Jun 11, 2026
* origin/main:
[core] V2: unify wait+step queue dispatch in suspension processing (#1925)
fix(world-local,world-postgres): make duplicate hook_created idempotent (#2295)
docs(observability): remove MVP implementation detail bullet (#2367)
fix: settle aborted parallel steps before completing abortParallelWorkflow (#2244)
Add native v4 workflow attribute events (#2226)
Version Packages (beta) (#2326)
[ci] Fix flaky windows unit tests (#2359)
Capture Vercel runtime logs when e2e Vercel Prod lanes fail (#2356)
Fix e2e failure reporting under vitest 4 and preserve fetch error causes (#2355)
[core] Fix process crash from rejected waitUntil promises (#2336)
[core] Remove duplicate `waitUntil` for suspension handler async operations (#2345)
Prevent local tests from hanging (#2338)
feat(core): add optional namespace for queue topic prefix (#2305)
[web-shared] Show precise durations in the new trace viewer (#2335)
Validate unique workflow step IDs at build time (#2018)
Move run attributes into their own detail card (#2327)
[core] Forward-port stream reconnect to getReadable level (#2318)
[docs] Add "Step executed multiple times" error page (#2310)
Fix flickering on the detail panel when navigating the trace viewer (#2325)
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

@VaguelySerious@TooTallNate