Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all \x3Cpre>\x3Ccode> 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: apply Vercel technical writing standards by TooTallNate · Pull Request #3704 · vercel/workflow · GitHub
Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp
, '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: apply Vercel technical writing standards by TooTallNate · Pull Request #3704 · vercel/workflow · GitHub
Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp
, '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: apply Vercel technical writing standards by TooTallNate · Pull Request #3704 · vercel/workflow · GitHub
Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp
, '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: apply Vercel technical writing standards by TooTallNate · Pull Request #3704 · vercel/workflow · GitHub
Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp
, '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: apply Vercel technical writing standards by TooTallNate · Pull Request #3704 · vercel/workflow · GitHub
Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp
, '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); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' docs: apply Vercel technical writing standards by TooTallNate · Pull Request #3704 · vercel/workflow · GitHub
Skip to content

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

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

docs: apply Vercel technical writing standards - #3704

Merged
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit
Aug 21, 2026
Merged

docs: apply Vercel technical writing standards#3704
TooTallNate merged 4 commits into
mainfrom
nrajlich/docs-writing-audit

Conversation

@TooTallNate

@TooTallNateTooTallNate commented Aug 20, 2026

Copy link
Copy Markdown
Member

Summary

Audits the complete Workflow SDK documentation corpus, package READMEs, skills, and source TSDoc/comments against the vercel-technical-writing skill and its style-rules.md reference.

  • normalizes content headings to sentence case while preserving every published heading slug
  • removes prose em dashes, filler wording, minimizers, and AI-writing patterns; intentional table placeholders and exact runtime/output strings remain unchanged
  • improves active voice, direct address, self-contained passages, section introductions, and American English
  • standardizes Vercel/product capitalization, Oxford commas, list labels, numbers, units, abbreviations, and UI references
  • labels every previously bare MDX code fence, fixes code-comment prose without changing sample semantics, and keeps v4/v5 behavior distinct
  • applies the same rules to package READMEs, contributor docs, skills, and real source TSDoc/comments (never executable strings or generated payloads)
  • bumps every modified skill's metadata.version, as required by AGENTS.md

This is intentionally a writing-only change. It modifies no executable code, types, runtime strings, APIs, or package behavior.

Scope

  • 337 pages under docs/content/ (v4, v5, and Worlds)
  • 227 TypeScript/TSX source files (comments/TSDoc only)
  • package READMEs, design docs, compiler specifications, workbench guides, docs/README.md, and AGENTS.md
  • generated package CHANGELOG.md files are explicitly excluded
  • 4 skills plus their reference Markdown (skill versions bumped)

Validation

  • pnpm test:docs (985 passed, 290 skipped)
  • pnpm --filter docs lint:links
  • pnpm --filter docs build (903 pages generated)
  • pnpm --filter docs lint:rendered-links
  • pnpm build (28/28 packages)
  • pnpm typecheck (43/43 tasks)
  • pnpm lint (existing advisory warnings only; no new diagnostics from this diff)
  • pnpm test: all suites passed except one existing timing-sensitive world-postgres retention test (should release a retained hook after its deadline); the isolated rerun passed
  • full diff review verified no executable code changes, no changed heading slugs, balanced/labeled fences, valid MDX/frontmatter, and no broken internal links

Intentional exceptions

  • em dashes used as table placeholders for “not applicable” remain
  • em dashes inside exact runtime messages, CLI output, and executable string literals remain
  • technically meaningful uses of words such as temporal “just,” comparative “simple,” and sample data remain
  • frontmatter titles and navigation labels retain their existing title case; content H2-H4 headings use sentence case

Docs Preview

All changed content pages are linked below. The preview deployment requires Vercel team access.

v4 docs (153 pages)
v5 docs (175 pages)
v4 Worlds (4 pages)
v5 Worlds (5 pages)

Audit the complete documentation corpus, package READMEs, skills, and
source TSDoc/comments against the vercel-technical-writing skill and
style-rules.md. Normalize sentence-case headings without changing
published anchors, remove prose em dashes and filler wording, improve
active voice and self-contained phrasing, standardize product/brand
capitalization, American English, list punctuation, units, and code
fence languages, and preserve exact runtime strings/table placeholders.
All executable code is unchanged. Modified skills have their metadata
versions bumped.
CopilotAI lite review requested due to automatic review settings August 20, 2026 23:54
@TooTallNate
TooTallNate requested review from a team and fantix as code ownersAugust 20, 2026 23:54
@changeset-bot

changeset-botBot commented Aug 20, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: e36efd8

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

@vercel

vercelBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

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

ProjectDeploymentActionsUpdated (UTC)
example-nextjs-workflow-turbopackReadyReadyPreview, v0Aug 21, 2026 9:24pm
example-nextjs-workflow-webpackBuildingBuildingPreview, v0Aug 21, 2026 9:24pm
example-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-astro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-express-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-fastify-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-hono-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nestjs-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nitro-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-nuxt-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-python-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-sveltekit-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-tanstack-start-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workbench-vite-workflowReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-docsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-swc-playgroundReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-tarballsReadyReadyPreview, v0Aug 21, 2026 9:24pm
workflow-webReadyReadyPreview, v0Aug 21, 2026 9:24pm

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

📊 Workflow Benchmarks

commit e36efd8 · Fri, 21 Aug 2026 22:14:41 GMT · run logs

Backend: vercel · app: nextjs-turbopack

MetricScenarioBest (ms)P75 (ms)P90 (ms)P99 (ms)Samples
TTFSstep1043 (+6.5%)1399 🔴 (+28%) 🔻1421 🔴 (+29%) 🔻1518 🔴 (+36%) 🔻30
TTFSstream366 (+57%) 🔻1413 🔴 (+29%) 🔻1450 🔴 (+27%) 🔻1759 🔴 (+37%) 🔻30
TTFShook + stream646 (-31%) 💚1775 🔴 (+30%) 🔻2237 🔴 (+61%) 🔻6522 🔴 (+354%) 🔻30
Fan-out TTFSPromise.all(100 steps)663 (+23%) 🔻2084 (+190%) 🔻2648 (+69%) 🔻4268 (+135%) 🔻10
Fan-out TTLSPromise.all(100 steps)2280 (+49%) 🔻6009 (+44%) 🔻9165 (+94%) 🔻9621 (+96%) 🔻10
STSO1020 steps (inline)118 (-3.3%)171 (-10%)193 (-13%)375 (-16%) 💚1019
WO1020 steps171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)171571 (-6.3%)1
CRTTfirst chunk (pooled)99 (+8.8%)158 (+19%) 🔻182 (+7.1%)206 (-1.9%)28

Streams

ScenarioCRTT 1stp75p90p99CDV maxiters
paced control (100/s, 60B)129 (+22%)165 (+20%)330 (+20%)1021 (+119%)183 (+24%)10
size sweep (100/s, 160B-12KB)131 (+12%)156 (+13%)233 (-38%)393 (-57%)128 (-3%)10
replay gateway-gpt-5.4-nano-2000t (1x)134 (-6%)136 (+20%)182 (+11%)371 (-52%)296 (-4%)3
replay eve-gpt-5.6-sol-2000t (1x)128 (-14%)171 (+35%)3388 (+2058%)5333 (+1861%)2624 (+809%)2
replay eve-gpt-5.6-sol-2000t (2x)142 (+23%)181 (+12%)266 (+16%)609 (+2%)555 (+109%)3
📈 STSO distribution vs main (inline / queue-hop histograms)

1020 steps (inline)

Cumulative STSO time: main 182882ms → this run 171347ms (Δ -11535ms, -6%)

100-150 ms ████████┃ main 214 this 251 +37
150-200 ms ██████████████████████░┃ main 611 this 681 +70
200-250 ms █┃███ main 135 this 52 -83
250-300 ms ┃ main 28 this 14 -14
300-350 ms ┃ main 11 this 7 -4
350-400 ms ┃ main 5 this 8 +3
400-450 ms ┃ main 6 this 4 -2
450-500 ms ┃ main 3 this 1 -2
500-550 ms ┃ main 1 this 1 +0
550-600 ms ┃ main 2 this 0 -2
600-650 ms ┃ main 1 this 0 -1
650-700 ms ┃ main 1 this 0 -1
700-750 ms ┃ main 1 this 0 -1
📈 CRTT drill-down vs main (RTT distributions & profiles)
variant RTT 1ms→5s+ avg p50 p90 p99 n
control ······▄█▂▁▁·· 158.6 (+35%) 120 (+14%) 330 (+20%) 1021 (+119%) 3000
sweep ······▄█▁···· 126.1 (-6%) 115 (+6%) 233 (-38%) 393 (-57%) 3000
gw 1x ·····▁▅█▁···· 118.4 (+10%) 109 (+17%) 182 (+11%) 371 (-52%) 5295
eve 1x ·····▁██▁▁▁▂▁ 416 (+303%) 106 (+19%) 3388 (+2058%) 5333 (+1861%) 5186
eve 2x ·····▁▃█▂▁··· 156.5 (+14%) 135 (+21%) 266 (+16%) 609 (+2%) 7779

RTT over stream progress (avg per tenth of stream, bars scaled min→max):

control ▄██▇▅▂▂▃▁▁ 113–217ms
sweep ▃▂▁▃▃█▅▂▂▁ 108–172ms
gw 1x ▆█▅▂▁▄▃▁▂▆ 107–136ms
eve 1x ▁▁▁▁▁▁▂█▃▁ 98–2109ms
eve 2x █▂▃▄▁▃▄▇▅▅ 121–203ms

RTT by chunk size (avg per log size bin, ~160B → ~12KB serialized, bars scaled min→max):

sweep ▄█▁▁▇▅▄ 125–127ms

Delivery jitter over stream progress (avg positive CDV per tenth of stream, bars scaled min→max):

control ▃█▆▂▁▁▂▄▂▂ 34–57ms
sweep ▁▃▃▄▄█▃▂▁▂ 44–70ms
gw 1x █▅▇▁▂▆▅▄▂▆ 30–41ms
eve 1x ▁▃▁▁▁▂█▂▂▃ 19–52ms
eve 2x █▅▂▂▁▃▃▁▅▄ 20–33ms
ℹ️ Metric definitions & methodology

Streams: first-chunk RTT (the stream-open path, before any buffering/backpressure), CRTT percentiles, and worst delivery stall (CDV max). Cells are medians across iterations; per-run values in the artifacts. No 🔴/🟢 marks until targets attach.

The collapsed STSO distribution section above buckets every step gap, split inline (same warm process — pure framework overhead) vs queue-hop (fresh process — dispatch, reinit, replay). = main, = this run, = fill.

The collapsed CRTT drill-down: per-variant RTT histograms (fixed log bins, · = empty) and mean RTT/positive-CDV profile lines over stream progress and chunk size. Histograms, avgs, and profiles merge exactly across runs; p50–p99 are percentile-of-percentiles. Per-index rows live in the artifacts.

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

Metrics — TTFS: time to first step body (in-deployment start() → first step body) · Fan-out TTFS: fan-out time to first step (in-deployment start() → first of the parallel step bodies to complete) · Fan-out TTLS: fan-out time to last step (in-deployment start() → last of the parallel step bodies to complete, i.e. when the Promise.all resolves) · STSO: step-to-step overhead (gap between consecutive step bodies) · WO: workflow overhead (whole-run time outside step bodies, in-deployment anchored) · CRTT: chunk round-trip time (per-chunk write → read latency, one clock domain: deployment → stream backend → same deployment) · CDV: chunk delay variation / delivery jitter (inter-arrival gap minus inter-write gap per seq-adjacent pair; skew-free; the row is each run's MAX positive value, so one stall moves it)

Scenarios — step: one trivial no-op step, no stream; no hooks, so the run stays in turbo mode (in-process fast path) · stream: one streaming step; no hooks, so the run stays in turbo mode (in-process fast path) · hook + stream: registers a hook before one step, which exits turbo mode (dispatch path) · 1020 steps: 1020 trivial sequential steps; STSO is measured between consecutive steps in the given step ranges, and WO is the whole-run overhead outside step bodies · Promise.all(100 steps): 100 trivial no-op steps started together in a single Promise.all; Fan-out TTFS is the first of them to complete and Fan-out TTLS the last, both from the in-deployment clientStart, so their gap is the spread the runtime adds across the fan-out · paced control (100/s, 60B): the control: 300 tiny (~60B) deltas metronome-paced at 100/s — zero workload structure, so it reads the transport floor and flush cadence, and disambiguates transport-wide vs workload-specific when a replay row moves · size sweep (100/s, 160B-12KB): same pacing as the control with deltas padded in rotation across seven log-spaced sizes (~160B–12KB) — rotation decouples size from stream position, so it isolates whether chunk size causes latency · replay gateway-gpt-5.4-nano-2000t (1x): raw provider SSE cadence captured at the AI gateway boundary (gpt-5.4-nano, the most popular gateway model; per-token deltas p50 208B = the modal production chunk size), replayed exactly as measured — the typical customer's workload; its CDV is the typical customer's real delivery jitter · replay eve-gpt-5.6-sol-2000t (1x): a captured eve turn (gpt-5.6-sol, the most-used demanding eve model; ~2000 output tokens = production p50 turn length) replayed exactly as measured — eve's envelope protocol re-ships the cumulative message so sizes ramp 142B→13KB; the demanding outlier tenant's reality · replay eve-gpt-5.6-sol-2000t (2x): the same eve capture at 2x — the headroom/stress row; real fast-tier models emit the same chunk sizes at proportionally higher rate, so time compression is a faithful speed model · first chunk (pooled): every run's seq-0 RTT pooled across all stream scenarios — the first chunk precedes any workload differentiation, so pooling samples one shared stream-open path with exact percentiles

Replay cadences (semantic sha256) — eve-gpt-5.6-sol-2000teaf22f5946e7c61f3c65c7006d550df180cfabd4e706254a09f22aec0cfb420d · gateway-gpt-5.4-nano-2000t6f24ac518b6b83ff1d0e85a5fe78230db192716d66a7fc6b2fe022752001d041

🔴 marks a percentile over its target (within target is left unmarked). Targets (p75/p90/p99, ms) — TTFS 200/300/600

All timestamps are deployment-side; runs are triggered in-deployment, so the CI runner and api.vercel.com sit outside every measured window. TTFS = start() → first step body (includes dispatch + any cold start); Fan-out TTFS/TTLS = first/last step completion of one Promise.all from the same anchor (the gap is the runtime’s fan-out spread); STSO/WO between step bodies; CRTT inside the workflow (excludes the api.vercel.com read path).

Cold starts stay in the numbers (real bursty-workload latency, inflates P75+); Best is the warm floor.

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

🧪 E2E Test Results

Some tests failed

❌ Failed E2E Tests

▲ Vercel Production (238 failed)

astro-node (6 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

astro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

example-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-node (6 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

express-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

fastify-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - reconnect to existing controller | wrun_41M0K3ZKH50GTP4S63XCWGVVVB | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

fastify-quickjs (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

hono-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • distributedAbortController - manual abort triggers signal | wrun_41M0K3YF6B0GY5C4DDD31NX8Y2 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

hono-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

nest-node (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nest-quickjs (10 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-node (4 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run | wrun_41M0K3NC2R0GSVH3X0N1WS1A5M | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes Promise.all of disjoint-key writes: every key lands

nextjs-turbopack-quickjs (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nextjs-webpack-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

nextjs-webpack-quickjs (13 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • hookSupersedeOwnerWorkflow - duplicate cancels the owner and claims the released token | wrun_41M0K3HVK40GM83XHTG5ZKEPPF | 🔍 observability
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

nitro-node (7 failed):

  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nitro-quickjs (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-node (8 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

nuxt-quickjs (10 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

python-node (8 failed):

  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3 | 🔍 observability
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C | 🔍 observability
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H | 🔍 observability
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07 | 🔍 observability
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2 | 🔍 observability
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2 | 🔍 observability
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S | 🔍 observability
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF | 🔍 observability

sveltekit-node (7 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes fire-and-forget: void setAttributes lands without awaiting

sveltekit-quickjs (13 failed):

  • webhookWorkflow | wrun_41M0K38A7X0GR09Y9DFH2E3V4D | 🔍 observability
  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue | wrun_41M0K3N8NQ0GS690VNHF86J17J | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run
  • setAttributes validation DX: invalid writes throw catchable FatalErrors naming rule and limit

tanstack-start-quickjs (11 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • AbortController abortThrowIfAbortedMidFlightWorkflow: throwIfAborted in a polling loop bails when abort fires
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes workflow throws after awaited setAttributes: attribute still persists on the failed run

vite-node (9 failed):

  • hookCleanupTestWorkflow - hook token reuse after workflow completion | wrun_41M0K3GPJT0GGGHMN3RE9ZGJ4Z | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

vite-quickjs (11 failed):

  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously | wrun_41M0K3FSEW0GRVZ2DE3GQ9SP5P | 🔍 observability
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered | wrun_41M0K3H7R00GWJAN912H6SYM53 | 🔍 observability
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable | wrun_41M0K3HTVA0GNN2VCYKC85R8Q8 | 🔍 observability
  • AbortController abortFromStepWorkflow: step abort cancels an in-flight sibling step
  • AbortController abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal
  • setAttributes start: initial attributes are seeded on run creation
  • setAttributes start: reserved-prefix initial attributes are seeded with allowReservedAttributes
  • setAttributes setAttributesWorkflow: workflow-body calls append native attr_set events and merge correctly
  • setAttributes setAttributesInsideStepWorkflow: step-body calls append attributed native events
  • setAttributes fire-and-forget: void setAttributes lands without awaiting
  • setAttributes Promise.all of disjoint-key writes: every key lands

🪟 Windows (6 failed)

nextjs-turbopack-node (6 failed):

  • DurableAgent e2e core basic text response
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • addTenWorkflow | wrun_41M0K379PG0GRE03JBP89M7G5G
  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • wellKnownAgentWorkflow (.well-known/agent) | wrun_41M0K38AFD0GY3Q5W7GR9ZTG7D
  • should work with react rendering in step

🌐 Cross-language Conformance (9 failed)

python (9 failed):

  • deploymentId: 'latest' is a no-op in non-Vercel worlds | wrun_01M0K3H55D0S9TAPVYE19YB2SK
  • promiseAllWorkflow | wrun_41M0K379PH0GSG2QJPZ13JF2T3
  • sleepingWorkflow | wrun_41M0K38KEB0GH9CD75REKVA92C
  • parallelSleepWorkflow | wrun_41M0K399FN0GHQ22JYV2R4HB8H
  • nullByteWorkflow | wrun_41M0K39JN30GX0V53TCN9YYE07
  • cancelRun - cancelling a running workflow | wrun_41M0K3R8YE0GH06RRYEJJPDAG2
  • cancelRun via CLI - cancelling a running workflow | wrun_41M0K3RDFE0GS0B89CDFBS73G2
  • sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration | wrun_41M0K3RMF00GR6HW2KX0GKWP4S
  • resilient start: addTenWorkflow completes when run_created returns 500 | wrun_41M0K3THMK0GXMQ1YY53QZ1SAF

⚠️ Flaky E2E Tests (passed on retry)

These tests failed at least once and passed on a retry. A recurring entry here is a real race worth investigating.

39 flaky tests
  • abortAnyInStepWorkflow: AbortSignal.any inside a step composes deserialized signals (express)
  • abortDeterministicBranchFromStepWorkflow: branches stay consistent when abort comes from a step (express)
  • abortFetchInFlightWorkflow: aborting cancels an in-flight fetch (astro)
  • abortFromStepWorkflow: step abort cancels an in-flight sibling step (express)
  • abortListenerWorkflow: signal.addEventListener fires on the deserialized step signal (astro)
  • cancelRun via CLI - cancelling a running workflow (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (example)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (express)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nest)
  • concurrent hook token conflict - two workflows cannot use the same hook token simultaneously (nitro)
  • distributedAbortController - manual abort triggers signal (nuxt)
  • distributedAbortController - manual abort triggers signal (tanstack-start)
  • distributedAbortController - reconnect to existing controller (nuxt)
  • distributedAbortController - reconnect to existing controller (tanstack-start)
  • distributedAbortController - reconnect to existing controller (vite)
  • fibonacciWorkflow - recursive workflow composition via start() (nextjs-webpack)
  • health check (CLI) - workflow health command reports healthy endpoints (nextjs-webpack)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (nuxt)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (sveltekit)
  • hookAdoptOwnerResultWorkflow - duplicate adopts the owner result via conflict.returnValue (vite)
  • hookCleanupTestWorkflow - hook token reuse after workflow completion (nitro)
  • hookGetConflictWorkflow - hook.getConflict() resolves with the conflicting run when token is already registered (nuxt)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (hono)
  • hookMinRetentionWorkflow - terminal Hook cannot resume and its token stays unavailable (tanstack-start)
  • hookSignalOwnerWorkflow - duplicate forwards its payload to the owner via resumeHook (nextjs-webpack)
  • Promise.all of disjoint-key writes: every key lands (express)
  • Promise.all of disjoint-key writes: every key lands (nextjs-turbopack)
  • Promise.all of disjoint-key writes: every key lands (tanstack-start)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (fastify)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (nitro)
  • resume-or-start route pattern - resumeHook retried after start() reaches the new run (tanstack-start)
  • setAttributesInsideStepWorkflow: step-body calls append attributed native events (tanstack-start)
  • start: reserved-prefix initial attributes are seeded with allowReservedAttributes (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (fastify)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nextjs-turbopack)
  • validation DX: invalid writes throw catchable FatalErrors naming rule and limit (nitro)
  • webhookWorkflow (astro)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (example)
  • workflow throws after awaited setAttributes: attribute still persists on the failed run (hono)

🛠 Infra Events (absorbed by the harness)

Platform anomalies the e2e harness detected and worked around (e.g. a run the queue never picked up, replaced by a fresh run). Clustered timestamps indicate a backend blip; a steady drip indicates a platform issue worth escalating.

51 infra events
  • cold-start-warmup · suite warmup (python) · at 21:23:07Z · abandoned wrun_41M0K35WFN0GR09TBV073V278K · (+7 more)
  • run-pickup-stall · nullByteWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0R0GKX5E8KC73WWMJN
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZV
  • run-pickup-stall · sleepingWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0N0GP82W298ZYBETZT
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:23:23Z · abandoned wrun_41M0K39H0F0GHDZGF62QRE0JV0
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:23Z · abandoned wrun_41M0K39HKG0GX1CFW14925GY7Z
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:23:56Z · abandoned wrun_41M0K3AH060GJ7N890HKV6B7KA
  • run-pickup-stall · sleepingWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC6J0GQHY5F2NZNHXJT5
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC5P0GN50VBTWR20BTBX
  • run-pickup-stall · nullByteWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BCAX0GJK47CB4VCH6W2X
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:24:24Z · abandoned wrun_41M0K3BC650GNKV0PSZQBBKB63
  • cold-start-warmup · suite warmup (tanstack-start) · at 21:24:53Z · abandoned wrun_01M0K3BXYGSB3P8X8YFCBX2QAA
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:25:14Z · abandoned wrun_41M0K3BG5Q0GWCR25EN6F235PV
  • cold-start-warmup · suite warmup (python) · at 21:26:02Z · abandoned wrun_01M0K3B6QG6SXFCPMS8SKGHR4A · (+7 more)
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW78C667ENTQYQTYK8E
  • run-pickup-stall · sleepingWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWD7W2816XP18SFCKN9
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVW8V4KHC0TDCGJQ55C0
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWFQY08NDXW3NY5GWSQ
  • run-pickup-stall · nullByteWorkflow (python) · at 21:26:17Z · abandoned wrun_01M0K3EVWHCWYYCKGZQH2HK7D0
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:26:55Z · abandoned wrun_41M0K3DECK0GQ4PZSV73TMVCA5
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:26:56Z · abandoned wrun_41M0K3DDW40GRFSHV3CG4QPN9R
  • run-pickup-stall · parallelSleepWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG4VZ7E0KP5BWVJXFHG
  • run-pickup-stall · promiseAllWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG34H2DJ3Z56HV3W079
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG194MRWFRET1VBSZJM
  • run-pickup-stall · nullByteWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPGAK400R7PQXBEATZCP
  • run-pickup-stall · sleepingWorkflow (python) · at 21:27:17Z · abandoned wrun_01M0K3GPG6Z86Z7CWN7PWF7ZHY
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:28:02Z · abandoned wrun_01M0K3J2FXSZ7W6KXHJRGAY8ZT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3VHC72R7Y33WP8X60R
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:17Z · abandoned wrun_01M0K3JH3YEDE0ZQ06F5TY0CNK
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:28:17Z · abandoned wrun_01M0K3JH44R2ZD2SNY1MX74VFT
  • run-pickup-stall · cancelRun - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEF6D7088S3V8S5E9J8E
  • run-pickup-stall · cancelRun via CLI - cancelling a running workflow (python) · at 21:28:47Z · abandoned wrun_01M0K3KEFFJR6YR7DM8SY465KF
  • run-pickup-stall · sleepInLoopWorkflow - sleep inside loop with steps actually delays each iteration (python) · at 21:29:17Z · abandoned wrun_01M0K3MBQ7XCJVKJWYTYPM9K7C
  • cold-start-warmup · suite warmup (nextjs-turbopack) · at 21:29:47Z · abandoned wrun_01M0K3J2FKME1TF5G23PEKMZ55 · (+7 more)
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YD
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FF
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFWPHRT5GVKBX3Y07YE
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FG
  • run-pickup-stall · basic text response (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQH84EASVM6RQANJ9X14
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:30:02Z · abandoned wrun_01M0K3NQFZX3JWCK0ZNN7D18FH
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4WSWNWJ1MRH6HNJ7NB
  • run-pickup-stall · addTenWorkflow (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ4Y2FP4VN0TB2SJR8DX
  • run-pickup-stall · should work with react rendering in step (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5W2Z8ENJ54XAHC85YW
  • run-pickup-stall · deploymentId: 'latest' is a no-op in non-Vercel worlds (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5R8VRYZJV02NHKKS21
  • run-pickup-stall · wellKnownAgentWorkflow (.well-known/agent) (nextjs-turbopack) · at 21:31:02Z · abandoned wrun_01M0K3QJ5G8D4XC68H4S6T4REE
  • run-pickup-stall · single tool call (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCQJHBX1TDJ5H5VKNBYB
  • run-pickup-stall · promiseAllWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCRZZG10KQ02Z8FR4SBP
  • run-pickup-stall · retainedInterleavingWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTFS9C4XWMVSW7TQS8C
  • run-pickup-stall · promiseAnyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCT2A8ZZE53F3GTGHSBZ
  • run-pickup-stall · importedStepOnlyWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCTKKJYT4R0X1Z47460V
  • run-pickup-stall · promiseRaceWorkflow (nextjs-turbopack) · at 21:32:02Z · abandoned wrun_01M0K3SCSBDPDESD44Y8918FZN

E2E Test Summary

Summary
PassedFailedSkippedTotal
❌ ▲ Vercel Production33402387424320
✅ 💻 Local Development392205584480
✅ 📦 Local Production392205584480
✅ 🐘 Local Postgres392205584480
❌ 🪟 Windows31460320
❌ 🌐 Cross-language Conformance09132141
✅ vercel-multi-region270027
Total15447253254818248
Details by Category

❌ ▲ Vercel Production

AppPassedFailedSkipped
❌ astro-node126628
❌ astro-quickjs124828
❌ example-node124828
❌ example-quickjs124828
❌ express-node126628
❌ express-quickjs1221028
❌ fastify-node124828
❌ fastify-quickjs123928
❌ hono-node1221028
❌ hono-quickjs1211128
❌ nest-node1221028
❌ nest-quickjs1221028
❌ nextjs-turbopack-node15343
❌ nextjs-turbopack-quickjs15073
❌ nextjs-webpack-node14893
❌ nextjs-webpack-quickjs144133
❌ nitro-node125728
❌ nitro-quickjs124828
❌ nuxt-node124828
❌ nuxt-quickjs1221028
❌ python-node08152
❌ sveltekit-node14479
❌ sveltekit-quickjs138139
❌ tanstack-start-node123928
❌ tanstack-start-quickjs1211128
❌ vite-node123928
❌ vite-quickjs1211128

✅ 💻 Local Development

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 📦 Local Production

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

✅ 🐘 Local Postgres

AppPassedFailedSkipped
✅ astro-stable-node134026
✅ astro-stable-quickjs134026
✅ express-stable-node134026
✅ express-stable-quickjs134026
✅ fastify-stable-node134026
✅ fastify-stable-quickjs134026
✅ hono-stable-node134026
✅ hono-stable-quickjs134026
✅ nest-stable-node134026
✅ nest-stable-quickjs134026
✅ nextjs-turbopack-canary-node141019
✅ nextjs-turbopack-canary-quickjs141019
✅ nextjs-turbopack-stable-node16000
✅ nextjs-turbopack-stable-quickjs16000
✅ nextjs-webpack-canary-node141019
✅ nextjs-webpack-canary-quickjs141019
✅ nextjs-webpack-stable-node16000
✅ nextjs-webpack-stable-quickjs16000
✅ nitro-stable-node134026
✅ nitro-stable-quickjs134026
✅ nuxt-stable-node134026
✅ nuxt-stable-quickjs134026
✅ sveltekit-stable-node15307
✅ sveltekit-stable-quickjs15307
✅ tanstack-start-node134026
✅ tanstack-start-quickjs134026
✅ vite-stable-node134026
✅ vite-stable-quickjs134026

❌ 🪟 Windows

AppPassedFailedSkipped
❌ nextjs-turbopack-node15460
✅ nextjs-turbopack-quickjs16000

❌ 🌐 Cross-language Conformance

AppPassedFailedSkipped
❌ python09132

✅ vercel-multi-region

AppPassedFailedSkipped
✅ nextjs-turbopack2700

📋 View full workflow run

@github-actions

github-actionsBot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

Sim World

Simulated world deterministic testing for races. Traces

🟠 world-sim scenario book — 1 fail of 41 total

fence=per-spec

scenariooutcomeeventsvirtreplayviolations
smoke-no-stepscompleted30msok0
smoke-one-stepcompleted60msok0
hook-at-step-startedcompleted120msok0
hook-at-step-completedcompleted120msok0
hook-at-hook-createdcompleted120msok0
deadline-hook-winscompleted71.0hok0
deadline-expirescompleted71.0hok0
long-sleepcompleted1130.0dok0
hook-never-arrivesstalled30msskipped0
step-retries-twicecompleted102.0sok0
parallel-stepscompleted90msok0
hook-on-execution-statecompleted120msok0
peek-hook-before-branchcompleted120msok0
peek-hook-after-branchcompleted120msok0
peek-hook-at-registrationcompleted120msok0
race-hook-before-probecompleted120msok0
race-hook-after-probecompleted120msok0
race-duplicate-deliverycompleted130msok0
attr-hook-before-stepcompleted110msok0
attr-hook-after-stepcompleted110msok0
attr-from-step-bodycompleted130msok0
fork-hook-after-timeoutcompleted141.0mok0
fork-hook-before-timeoutcompleted141.0mok0
count-hook-after-timeoutcompleted171.0mok0
count-hook-before-timeoutcompleted201.0mok0
stale-read-step-count-forkcompleted201.0mok0
stale-read-equal-step-countscompleted141.0mok0
step-vs-step-forkcompleted120msok0
step-vs-step-fork-fencedcompleted120msok0
fence-catches-benign-directioncompleted125msok0
in-flight-before-decisioncompleted171.0mok0
in-flight-before-decision-countedcompleted171.0mok0
in-flight-after-decisioncompleted192.0mok0
stale-read-step-count-fork-fencedcompleted201.0mok0
fork-hook-winscompleted131.0mok0
fork-timeout-winscompleted131.0mok0
unclaimed-payload-under-forkcompleted171.0mok0
claimed-payload-under-forkcompleted171.0mok0
writers-independent-step-bodiescompleted120msok0
writers-scripted-tempocompleted120msok0
cancel-mid-stepcancelled70msskipped0

Full trace: world-sim.txt

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Applies Vercel technical-writing style rules across the Workflow SDK documentation, skills/reference material, package READMEs, and in-code comments/TSDoc—intended to be a writing-only change with no runtime/API behavior changes.

Changes:

  • Normalizes headings and prose style (sentence case, punctuation, filler removal) across docs and reference content.
  • Updates in-repo skills and package READMEs for consistent terminology/capitalization and clearer phrasing.
  • Refines inline code comments/TSDoc (clarity/punctuation) across multiple packages without changing executable logic.

Reviewed changes

Copilot reviewed 244 out of 582 changed files in this pull request and generated 1 comment.

Show a summary per file
FileDescription
skills/workflow-init/SKILL.mdBumps skill version + sentence-case headings and prose tweaks.
skills/migrating-to-workflow-sdk/references/temporal.mdPunctuation/clarity edits in migration mapping reference.
skills/migrating-to-workflow-sdk/references/retries.mdLink-list formatting/wording standardization.
skills/migrating-to-workflow-sdk/references/inngest.mdPunctuation/clarity edits in migration checklist.
skills/migrating-to-workflow-sdk/references/aws-step-functions.mdPunctuation/clarity edits in migration checklist.
packages/world/src/ulid.tsComment wording/punctuation tweaks only.
packages/world/src/steps.tsComment wording tweak only.
packages/world/src/spec-version.tsComment wording/punctuation tweaks only.
packages/world/src/node-http.tsComment punctuation tweak only.
packages/world/src/attributes.tsComment punctuation tweaks only.
packages/world-vercel/src/ws-transport-enabled.tsComment punctuation tweaks only.
packages/world-vercel/src/steps.tsComment punctuation tweaks only.
packages/world-vercel/src/run-id/codec.tsComment punctuation tweaks only.
packages/world-vercel/src/instrumentObject.tsComment punctuation tweaks only.
packages/world-vercel/src/index.tsComment punctuation tweaks only.
packages/world-vercel/src/analytics.tsComment punctuation tweak only.
packages/world-vercel/README.mdProse tweaks for clarity/terminology (Node.js, examples).
packages/world-sim/src/streams.tsComment punctuation tweak only.
packages/world-sim/src/queue.tsComment punctuation + American English (“behavior”).
packages/world-sim/src/load.tsComment clarity/punctuation tweaks only.
packages/world-sim/src/invariants.tsComment punctuation tweaks only.
packages/world-sim/src/index.tsComment punctuation tweaks only.
packages/world-sim/src/drive.tsComment punctuation tweaks only.
packages/world-sim/src/clock.tsComment punctuation tweaks only.
packages/world-postgres/src/queue.tsComment wording tweaks only.
packages/world-local/src/telemetry.tsComment punctuation tweak only.
packages/world-local/src/storage/runs-storage.tsComment punctuation tweaks only.
packages/world-local/src/storage/legacy.tsComment punctuation tweaks only.
packages/world-local/src/storage/hooks-storage.tsComment punctuation tweaks only.
packages/world-local/src/init.tsComment punctuation tweak only.
packages/world-local/src/index.tsComment punctuation tweaks only.
packages/workflow/src/internal/builtins.tsComment rewrite for clarity (no logic changes).
packages/web-shared/src/lib/zstd-browser-decoder.tsComment punctuation tweak only.
packages/web-shared/src/lib/utils.tsComment punctuation tweak only.
packages/web-shared/src/components/workflow-traces/trace-span-construction.tsComment wording/punctuation tweaks only.
packages/web-shared/src/components/ui/timestamp-tooltip.tsxComment wording + heading punctuation tweaks only.
packages/web-shared/src/components/ui/error-stack-block.tsxComment punctuation/wording tweaks only.
packages/web-shared/src/components/ui/data-inspector.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/trace-viewer.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/use-row-window.tsComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/minimap.tsxComment punctuation tweaks only.
packages/web-shared/src/components/trace-viewer/components/draggable-border.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel.tsxComment punctuation tweak only.
packages/web-shared/src/components/trace-viewer/components/detail-panel-width.tsComment punctuation tweaks only.
packages/web-shared/src/components/stream-viewer.tsxComment punctuation tweak only.
packages/web-shared/src/components/sidebar/resolve-hook-modal.tsxJSX comment punctuation tweaks only.
packages/web-shared/src/components/sidebar/events-list.tsxComment punctuation tweaks only.
packages/web-shared/src/components/sidebar/entity-detail-panel.tsxComment punctuation tweak only.
packages/web-shared/README.mdProse/style tweaks; clarifies auth note and Next.js/Tailwind wording.
packages/vite/src/hot-update.tsComment wording tweak only.
packages/utils/src/world-target.tsComment punctuation tweak only.
packages/sveltekit/src/plugin.tsComment punctuation tweak only.
packages/rollup/src/index.tsComment punctuation tweaks only.
packages/nitro/src/types.tsDoc comment wording/punctuation tweaks only.
packages/nitro/src/builders.tsDoc comment wording/punctuation tweaks only.
packages/next/src/watch-ignore.tsComment punctuation tweaks only.
packages/next/src/builder-eager.tsComment punctuation tweak only.
packages/nest/src/workflow.module.tsDoc comment punctuation tweak only.
packages/nest/src/cjs-rewrite.tsComment punctuation tweaks only.
packages/errors/src/internal-chalk.tsComment punctuation tweaks only.
packages/docs-typecheck/src/type-checker.tsComment punctuation tweak only.
packages/docs-typecheck/src/docs-globals.d.tsComment punctuation tweak only.
packages/core/src/workflow/world-init-stub.tsComment punctuation tweak only.
packages/core/src/workflow/sleep.tsComment punctuation tweak only.
packages/core/src/workflow/set-attributes.tsComment punctuation tweak only.
packages/core/src/workflow/get-workflow-metadata.tsComment punctuation tweak only.
packages/core/src/workflow/create-hook.tsComment punctuation tweak only.
packages/core/src/vm/uint8array-base64.tsComment punctuation tweak only.
packages/core/src/vm/index.tsComment punctuation tweaks only.
packages/core/src/symbols.tsComment punctuation tweaks only.
packages/core/src/source-map.tsComment punctuation tweaks only.
packages/core/src/set-attributes.tsComment punctuation tweak only.
packages/core/src/serialization/workflow-vm.tsComment punctuation tweak only.
packages/core/src/serialization/step.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function.tsComment wording tweak only.
packages/core/src/serialization/reducers/step-function-vm.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class.tsComment punctuation tweak only.
packages/core/src/serialization/reducers/class-vm.tsComment punctuation tweak only.
packages/core/src/serialization/index.tsComment punctuation tweak only.
packages/core/src/serialization/format.tsComment list formatting/punctuation tweaks only.
packages/core/src/serialization/errors.tsComment punctuation tweak only.
packages/core/src/serialization/codec.tsDoc comment punctuation/clarity tweaks only.
packages/core/src/serialization/codec-devalue.tsComment punctuation tweak only.
packages/core/src/serialization/codec-devalue-vm.tsComment punctuation/clarity tweaks only.
packages/core/src/serialization/client.tsComment wording tweak only.
packages/core/src/runtime/world.tsComment punctuation tweaks only.
packages/core/src/runtime/world-init.tsComment punctuation/clarity tweaks only.
packages/core/src/runtime/wait-until.tsComment punctuation tweak only.
packages/core/src/runtime/vm-mode.tsComment wording tweak only.
packages/core/src/runtime/unserializable-step.tsComment punctuation tweaks only.
packages/core/src/runtime/runs.tsComment punctuation tweaks only.
packages/core/src/runtime/run-id-time.tsComment punctuation tweaks only.
packages/core/src/runtime/replay-recovery-reporter.tsComment punctuation tweak only.
packages/core/src/runtime/get-world-lazy.tsComment formatting tweaks only.
packages/core/src/runtime/compute-instance.tsComment terminology tweaks (ID/OpenTelemetry) only.
packages/core/src/replay-payload-cache.tsComment punctuation tweaks only.
packages/core/src/logger.tsComment punctuation tweaks only.
packages/core/src/index.tsFile header comment wording tweak only.
packages/core/src/global.tsComment punctuation tweak only.
packages/core/src/define-hook.tsComment punctuation tweak only.
packages/core/src/create-hook.tsDoc comment punctuation tweaks only.
packages/core/src/capture-stack.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/web.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/vercel-link.tsComment punctuation tweaks only.
packages/cli/src/lib/inspect/run.tsComment punctuation tweak only.
packages/cli/src/lib/inspect/env.tsComment wording/punctuation tweaks only.
packages/cli/src/lib/inspect/auth.tsComment wording tweak only.
packages/cli/src/lib/bulk-cancel.tsComment punctuation tweaks only.
packages/builders/src/vercel-build-output-api.tsComment punctuation tweak only.
packages/builders/src/types.tsDoc comment wording tweaks only.
packages/builders/src/optional-ws-native.tsComment punctuation tweak only.
packages/builders/src/optional-typescript.tsComment punctuation tweak only.
packages/builders/src/optional-otel-api.tsComment punctuation tweak only.
packages/builders/src/node-module-esbuild-plugin.tsComment punctuation tweaks only.
packages/builders/src/module-specifier.tsComment punctuation tweak only.
packages/builders/src/fast-discovery.tsComment punctuation tweak only.
packages/builders/src/constants.tsComment punctuation tweaks only.
packages/builders/README.mdHeading sentence-case normalization.
packages/ai/src/stream-iterator.tsComment punctuation tweak only.
packages/ai/src/providers/mock.tsComment punctuation/clarity tweaks only.
packages/ai/src/normalize-ui-message-stream.tsComment punctuation tweak only.
packages/ai/src/agent/types.tsComment wording tweak only.
packages/ai/src/agent/telemetry.tsComment wording/American English tweaks only.
packages/ai/src/agent/do-stream-step.tsComment punctuation/clarity tweaks only.
packages/ai/README.mdHeading sentence-case normalization + wording tweaks.
docs/README.mdHeading sentence-case normalization.
docs/content/worlds/v4/local.mdxHeading sentence-case normalization.
docs/content/docs/v5/internal/nitro-web-ui.mdxProse/list punctuation tweaks; link label formatting.
docs/content/docs/v5/internal/nitro-native-build.mdxLink-list formatting tweaks.
docs/content/docs/v5/internal/index.mdxLink-list formatting tweaks.
docs/content/docs/v5/getting-started/python.mdxHeading sentence-case normalization.
docs/content/docs/v5/foundations/versioning.mdxProse clarity tweaks.
docs/content/docs/v5/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v5/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v5/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v5/errors/index.mdxHeading normalization.
docs/content/docs/v5/cookbook/common-patterns/rate-limiting.mdxPattern heading casing normalization.
docs/content/docs/v5/configuration/cli-and-web-ui.mdxWording/terminology tweaks (UI expansion, canceled).
docs/content/docs/v5/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v5/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/set-attributes.mdxProse punctuation tweak for clarity.
docs/content/docs/v5/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-sveltekit/workflow-plugin.mdxTable copy/punctuation tweaks.
docs/content/docs/v5/api-reference/workflow-serde/workflow-deserialize.mdxHeading casing + prose tightening.
docs/content/docs/v5/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdxProse punctuation tweak (dash → parentheses) + terminology.
docs/content/docs/v5/api-reference/workflow-runtime/workflow-entrypoint.mdxProse clarity tweaks + heading casing.
docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/index.mdxIntro text rewrite + heading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v5/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v5/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v5/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v5/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v5/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v5/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v5/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v5/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v5/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v5/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v5/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
docs/content/docs/v4/internal/index.mdxHeading casing normalization.
docs/content/docs/v4/getting-started/python.mdxHeading casing normalization.
docs/content/docs/v4/errors/workflow-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-not-registered.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/step-executed-multiple-times.mdxHeading normalization.
docs/content/docs/v4/errors/start-invalid-workflow-function.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/replay-divergence.mdxHeading normalization.
docs/content/docs/v4/errors/node-js-module-in-workflow.mdxHeading normalization + code fence labeled as text.
docs/content/docs/v4/errors/index.mdxHeading normalization.
docs/content/docs/v4/changelog/index.mdxList formatting changes (date in parentheses).
docs/content/docs/v4/api-reference/workflow/sleep.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/retryable-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-workflow-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/get-step-metadata.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow/fetch.mdxHeading casing + prose tightening in examples.
docs/content/docs/v4/api-reference/workflow/fatal-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-vite/workflow.mdxTerminology expansions (IDE) + punctuation in returns text.
docs/content/docs/v4/api-reference/workflow-sveltekit/workflow-plugin.mdxReturns text punctuation tweak.
docs/content/docs/v4/api-reference/workflow-serde/workflow-serialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/workflow-deserialize.mdxProse tightening only.
docs/content/docs/v4/api-reference/workflow-serde/index.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/world/index.mdxProse punctuation + terminology (“user interface (UI)”).
docs/content/docs/v4/api-reference/workflow-runtime/step-entrypoint.mdxProse punctuation + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/set-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/index.mdxIntro rewrite + heading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/health-check.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-runtime/get-world-handlers.mdxProse punctuation tweaks + related list formatting.
docs/content/docs/v4/api-reference/workflow-observability/parse-class-name.mdxTerminology tweak (“user interface”) + punctuation.
docs/content/docs/v4/api-reference/workflow-observability/observability-revivers.mdxProse punctuation tweaks only.
docs/content/docs/v4/api-reference/workflow-nuxt/index.mdxTerminology expansions (SSR/IDE) + punctuation.
docs/content/docs/v4/api-reference/workflow-nest/workflow-controller.mdxProse punctuation tweak.
docs/content/docs/v4/api-reference/workflow-nest/configure-workflow-controller.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/workflow-runtime-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-found-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-not-completed-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/workflow-run-cancelled-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/workflow-error.mdxProse punctuation tweaks + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/too-early-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/throttle-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/run-not-supported-error.mdxProse punctuation tweak + heading casing.
docs/content/docs/v4/api-reference/workflow-errors/run-expired-error.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-errors/hook-conflict-error.mdxProse punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-errors/entity-conflict-error.mdxComment punctuation tweak + terminology (“virtual machine contexts”).
docs/content/docs/v4/api-reference/workflow-astro/workflow.mdxProse punctuation tweak (dash → colon).
docs/content/docs/v4/api-reference/workflow-api/resume-webhook.mdxHeading casing normalization.
docs/content/docs/v4/api-reference/workflow-api/index.mdxIntro rewrite + callout punctuation tweak.
docs/content/docs/v4/api-reference/workflow-ai/index.mdxIntro rewrite + deprecated label formatting.
docs/content/docs/v4/ai/streaming-updates-from-tools.mdxHeading casing normalization.
docs/content/docs/v4/ai/defining-tools.mdxProse clarity fixes + heading casing normalization.
.changeset/technical-writing-audit.mdAdds a changeset file (currently empty/placeholder).

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread.changeset/technical-writing-audit.md
Apply the same technical-writing rules to design documents, compiler
specifications, workbench guides, package changelogs, and the remaining
tracked Markdown outside the deployed docs corpus. Preserve historical
meaning, commands, output literals, table placeholders, and heading
anchors.

@pranaygppranaygp left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

lgtm although we should probably also just install the skill in this repo itself and have agents.md remember to always use it going forward

@TooTallNate
TooTallNate enabled auto-merge (squash) August 21, 2026 18:07
…-audit
# Conflicts:
#	AGENTS.md
#	docs/content/docs/v5/api-reference/workflow-api/start.mdx
#	docs/content/docs/v5/api-reference/workflow-errors/precondition-failed-error.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/set-world.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/index.mdx
#	docs/content/docs/v5/api-reference/workflow-runtime/world/queue.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-aws-step-functions.mdx
#	docs/content/docs/v5/comparisons/workflow-sdk-vs-cloudflare-workflows.mdx
#	docs/content/docs/v5/configuration/runtime-tuning.mdx
#	docs/content/docs/v5/deploying.mdx
#	docs/content/docs/v5/foundations/cancellation.mdx
#	docs/content/docs/v5/foundations/starting-workflows.mdx
#	docs/content/docs/v5/foundations/streaming.mdx
#	docs/content/docs/v5/how-it-works/code-transform.mdx
#	docs/content/docs/v5/how-it-works/encryption.mdx
#	docs/content/docs/v5/how-it-works/event-sourcing.mdx
#	docs/content/docs/v5/internal/index.mdx
#	docs/content/docs/v5/internal/nitro-web-ui.mdx
#	docs/content/worlds/v4/vercel.mdx
#	docs/content/worlds/v5/building-a-world.mdx
#	docs/content/worlds/v5/vercel.mdx
@github-actions

Copy link
Copy Markdown
Contributor

Backport to stable failed for e1e64e3 due to a workflow error (backport job run).

This is usually an infrastructure problem (e.g. the configured AI model could not be found, an AI Gateway error, or an opencode crash) rather than a merge conflict. Check the job logs linked above for details.

Once the underlying issue is fixed, re-run the Backport to stable workflow manually via workflow_dispatch and paste this commit SHA into the ref input:

e1e64e3de30e10cba6803907b789699e851d33e2

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.

3 participants

@TooTallNate@pranaygp