[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-vercel-migrating-workflow-v4-to-v5":3,"mdc--kmydq7-key":33,"related-repo-vercel-migrating-workflow-v4-to-v5":3933,"related-org-vercel-migrating-workflow-v4-to-v5":4003},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":22,"repoUrl":23,"updatedAt":24,"license":25,"forks":26,"topics":27,"repo":28,"sourceUrl":31,"mdContent":32},"migrating-workflow-v4-to-v5","migrate Workflow SDK to version 5","Upgrades an app from Workflow SDK 4.x to 5.0. Use when bumping the `workflow` \u002F `@workflow\u002F*` dependencies to v5, or when hitting removed v4 APIs — `runStep`, `stepEntrypoint`, `workflow\u002Finternal\u002Fprivate`, `@workflow\u002Fcore\u002Fprivate`, `writeToStream` \u002F `closeStream` \u002F `readFromStream` on a World, `world.steps.get` without a runId, `hook.getConflict()` returning `{ runId }`, `experimental_setAttributes`, `createLocalWorld` \u002F `createVercelWorld`, `NestLocalBuilder` imported from `@workflow\u002Fnest`, or an SWC transform invoked with `mode: 'client'`.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"vercel","Vercel","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fvercel.png",[12,16,19],{"name":13,"slug":14,"type":15},"Workflow","workflow","tag",{"name":17,"slug":18,"type":15},"Migration","migration",{"name":20,"slug":21,"type":15},"Engineering","engineering",2228,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fworkflow","2026-08-28T15:10:16.373575",null,307,[],{"repoUrl":23,"stars":22,"forks":26,"topics":29,"description":30},[],"Workflow SDK: Build durable, reliable, and observable apps and AI Agents in TypeScript","https:\u002F\u002Fgithub.com\u002Fvercel\u002Fworkflow\u002Ftree\u002FHEAD\u002Fskills\u002Fmigrating-workflow-v4-to-v5","---\nname: migrating-workflow-v4-to-v5\ndescription: >-\n  Upgrades an app from Workflow SDK 4.x to 5.0. Use when bumping the `workflow` \u002F `@workflow\u002F*` dependencies to v5, or when hitting removed v4 APIs — `runStep`, `stepEntrypoint`, `workflow\u002Finternal\u002Fprivate`, `@workflow\u002Fcore\u002Fprivate`, `writeToStream` \u002F `closeStream` \u002F `readFromStream` on a World, `world.steps.get` without a runId, `hook.getConflict()` returning `{ runId }`, `experimental_setAttributes`, `createLocalWorld` \u002F `createVercelWorld`, `NestLocalBuilder` imported from `@workflow\u002Fnest`, or an SWC transform invoked with `mode: 'client'`.\nmetadata:\n  author: Vercel Inc.\n  version: '0.2.9'\n---\n\n# Migrating Workflow SDK 4.x to 5.0\n\nWorkflow SDK 5.0 keeps the programming model from 4.x. `\"use workflow\"` \u002F `\"use step\"`, `start()`, `getRun()`, hooks, webhooks, streams, `sleep()`, retries, and the event log are unchanged, so most application code compiles as-is.\n\nThe breaking changes are concentrated in three places:\n\n1. **Runtime entrypoints** (`workflow\u002Fapi`, `workflow\u002Fruntime`) — two exports removed.\n2. **The `World` interface** — only relevant if the app implements a custom World or calls `getWorld()` directly.\n3. **Build integrations** — `@workflow\u002Fnest` subpaths, and private compiler subpaths that were never public.\n\nDo not rewrite workflow or step bodies. If you find yourself restructuring business logic, you have gone outside this migration.\n\n## Intake\n\nBefore editing, establish:\n\n1. **Which packages are installed.** Read `package.json` for `workflow` and every `@workflow\u002F*` dependency.\n2. **Whether the app touches the runtime.** Grep for `getWorld`, `createWorld`, `getWorldHandlers`, `writeToStream`, `readFromStream`, `closeStream`, `listStreamsByRunId`, `getStreamChunks`, `world.steps`, `listByCorrelationId`, `runStep`, `stepEntrypoint`, `internal\u002Fprivate`, `core\u002Fprivate`.\n3. **Whether the app implements a custom World.** Grep for `implements World`, `: World`, `createLocalWorld`, `createVercelWorld`, `startWorkflowWorld`.\n4. **Which framework integration is in use.** `@workflow\u002Fnext`, `@workflow\u002Fnest`, `@workflow\u002Fnitro`, `@workflow\u002Fsveltekit`, `@workflow\u002Fvite`, `@workflow\u002Fnuxt`, `@workflow\u002Fastro`, or the CLI.\n5. **Whether `hook.getConflict()` is used.** Grep for `getConflict`.\n6. **Whether the app calls the compiler directly.** Grep for `mode: 'client'`, `transformSync`, `swc-plugin-workflow`. Only custom build integrations do this.\n7. **Whether `experimental_setAttributes` is used.** Grep for `experimental_setAttributes`.\n\nReport anything in 2–7 that the app does not use as \"not applicable\" rather than silently skipping it.\n\n## Step 1 — bump the dependencies\n\nMove every `workflow` and `@workflow\u002F*` dependency to `^5.0.0`. They are released together and must not be mixed across majors — a 4.x `@workflow\u002Fnext` against a 5.x `workflow` will fail at build time.\n\n```json\n{\n  \"dependencies\": {\n    \"workflow\": \"^5.0.0\",\n    \"@workflow\u002Fnext\": \"^5.0.0\"\n  }\n}\n```\n\nThen reinstall and rebuild so the compiler regenerates the workflow\u002Fstep bundles and the generated routes under `.well-known\u002Fworkflow\u002Fv1\u002F`. Never hand-edit generated output.\n\nNode requirements are unchanged: `^18 || ^20 || ^22 || ^24`.\n\n## Step 2 — apply the mechanical rewrites\n\nApply each rule only where the pattern actually appears.\n\n### `getWorld()` and `createWorld()` are async\n\n```ts\n\u002F\u002F v4\nconst world = getWorld();\n\n\u002F\u002F v5\nconst world = await getWorld();\n```\n\nThis also applies to `getWorldHandlers()`. Awaiting was already correct in 4.x, so this edit is safe to make before the dependency bump. Propagate `async` up the call chain rather than wrapping in `.then()` chains.\n\n### `createLocalWorld()` and `createVercelWorld()` removed\n\nFirst-party World packages now expose a single `createWorld()` factory. The arguments are unchanged — this is a rename only.\n\n```ts\n\u002F\u002F v4\nimport { createLocalWorld } from '@workflow\u002Fworld-local';\nconst world = createLocalWorld({ dataDir });\n\n\u002F\u002F v5\nimport { createWorld } from '@workflow\u002Fworld-local';\nconst world = createWorld({ dataDir });\n```\n\nThe same applies to `createVercelWorld` from `@workflow\u002Fworld-vercel`.\n\n### `runStep` removed from `workflow\u002Fapi`\n\nCall the step function directly. The compiler routes the call through the step runtime.\n\n```ts\n\u002F\u002F v4\nimport { runStep } from 'workflow\u002Fapi';\nconst result = await runStep(chargeCard, [orderId]);\n\n\u002F\u002F v5\nconst result = await chargeCard(orderId);\n```\n\n### `stepEntrypoint` removed from `workflow\u002Fruntime`\n\nFramework integrations generate step routes themselves — delete hand-written step routes that existed only to call `stepEntrypoint`. For a custom host, serve the handlers from `getWorldHandlers()` instead.\n\n### `workflow\u002Finternal\u002Fprivate` and `@workflow\u002Fcore\u002Fprivate` removed\n\nThese subpaths were never public API. Remove the imports; if generated build output still references them, it is stale — reinstall and rebuild rather than restoring the imports.\n\n### Stream methods moved to `world.streams.*` with `runId` first\n\n| v4 | v5 |\n| --- | --- |\n| `world.writeToStream(name, runId, chunk)` | `world.streams.write(runId, name, chunk)` |\n| `world.writeToStreamMulti(name, runId, chunks)` | `world.streams.writeMulti(runId, name, chunks)` |\n| `world.closeStream(name, runId)` | `world.streams.close(runId, name)` |\n| `world.readFromStream(name, startIndex?)` | `world.streams.get(runId, name, startIndex?)` |\n| `world.getStreamChunks(name, runId, options?)` | `world.streams.getChunks(runId, name, options?)` |\n| `world.listStreamsByRunId(runId)` | `world.streams.list(runId)` |\n\nThe argument order flipped, so a rename alone silently passes a stream name where a run ID is expected. Swap the arguments at every call site. `readFromStream` had no `runId` parameter at all — `streams.get` requires one, so thread the owning run ID through to the call.\n\nApplication code that uses `getWritable()` inside a workflow or reads `run.readable` is unaffected; this rule is only for direct `World` access.\n\n### `world.steps.get()` requires a `runId`\n\nThe first parameter was `string | undefined` and is now `string`. Pass the run ID that owns the step.\n\n```ts\n\u002F\u002F v4\nconst step = await world.steps.get(undefined, stepId);\n\n\u002F\u002F v5\nconst step = await world.steps.get(runId, stepId);\n```\n\n### `events.listByCorrelationId()` requires a `runId`\n\nA correlation ID identifies a step, hook or wait within its run, not across runs. The lookup is scoped to one run, so pass the run that owns the ID. The same applies to `analytics.events.listByCorrelationId()`.\n\n```ts\n\u002F\u002F v4\nconst events = await world.events.listByCorrelationId({ correlationId });\n\n\u002F\u002F v5\nconst events = await world.events.listByCorrelationId({ runId, correlationId });\n```\n\n### `hook.getConflict()` resolves with a `Run`\n\nThe resolved value is now the conflicting run handle rather than `{ runId }`. `conflict.runId` still reads the same, so existing code keeps working — but the round trip through a step to fetch the run can be deleted.\n\n```ts\n\u002F\u002F v4\nconst conflict = await hook.getConflict();\nif (conflict) {\n  const run = await fetchRun(conflict.runId); \u002F\u002F \"use step\" wrapper around getRun()\n  return { dedupedTo: await run.returnValue };\n}\n\n\u002F\u002F v5\nconst conflict = await hook.getConflict();\nif (conflict) {\n  return { dedupedTo: await conflict.returnValue };\n}\n```\n\n`await conflict.status` and `await conflict.cancel()` are available on the same handle. Do not remove the `if (conflict)` null check — `getConflict()` still resolves `null` when the token was claimed cleanly.\n\n### `experimental_setAttributes` renamed to `setAttributes`\n\n```ts\n\u002F\u002F v4\nimport { experimental_setAttributes } from 'workflow';\n\n\u002F\u002F v5\nimport { setAttributes } from 'workflow';\n```\n\nThe old name was removed in v5, so this rewrite is required. `ExperimentalSetAttributesOptions` is likewise now `SetAttributesOptions`. The `attributes` option on `start()` is unchanged.\n\n### `mode: 'client'` removed from the SWC transform\n\nOnly relevant to a custom build integration that calls the compiler itself. The `client` mode merged into `step`, which now absorbs hoisted variable references and dead-code elimination. Pass `mode: 'step'`.\n\n### `NestLocalBuilder` moved out of the `@workflow\u002Fnest` root\n\n```ts\n\u002F\u002F v4\nimport { NestLocalBuilder } from '@workflow\u002Fnest';\n\n\u002F\u002F v5\nimport { NestLocalBuilder } from 'workflow\u002Fnest\u002Fbuilder';\n```\n\n`NestVercelBuilder` lives at `workflow\u002Fnest\u002Fvercel-builder`. `WorkflowModule` still comes from `@workflow\u002Fnest`; the split keeps the build toolchain out of the runtime bundle, so do not re-export the builder from a module that runtime code imports.\n\n## Step 3 — flag the behavior changes that need a decision\n\nThese are not code edits. Report each one that applies, and do not \"fix\" them silently.\n\n- **Tracing defaults to `linked`.** Each workflow and step invocation is its own trace root with span links to the enqueue site and the run origin, instead of one trace per run. If the app has dashboards, saved queries, or alerts keyed on a single trace ID per run, either move them to the `workflow.run.id` attribute or set `WORKFLOW_TRACE_MODE=continuous` to restore the 4.x shape.\n- **The event-creation precondition guard is gone.** `WORKFLOW_PRECONDITION_GUARD` no longer exists; remove it from the app's environment and deployment config if it is set. No World in the SDK rejects a write for a stale snapshot any more — a replay that is behind learns what it missed from the write it makes next.\n- **Turbo mode is on by default.** The first invocation of a run backgrounds `run_started` and skips the initial event-log load. `WORKFLOW_TURBO=0` disables it.\n- **Errors keep their type.** `WorkflowRunFailedError.cause` now preserves the original class identity and cause chain. Code that pattern-matched on `error.message` because the class was flattened in 4.x can use `instanceof` — but flag it rather than rewriting error handling unprompted.\n- **Event IDs are slot numbers, not ULIDs.** An event ID is now its 1-based position in the run's log (`evnt_00000000000000000000000042`), unique only within a run and carrying no timestamp. Report any app code that uses an event ID as a global key (pair it with the `runId`) or decodes a time out of one (read `createdAt` off the event). Other entity IDs are unchanged.\n- **A per-run event limit is enforced.** The World supplies the ceiling (25,000 events on the Local and Vercel Worlds) and a run that reaches it fails with `MAX_EVENTS_EXCEEDED`. Flag any workflow with an unbounded loop; the fix is a child run per batch, which is a design change, not a migration edit.\n- **Stream writes flush the leading chunk immediately.** The flush window default went from 10ms to 0. An app that relied on the window to coalesce a burst of tiny chunks can set `streamFlushIntervalMs` or `WORKFLOW_STREAM_FLUSH_INTERVAL_MS`.\n- **Generated step, workflow and webhook bundles are ESM** (the VM-executed workflow bundle stays CJS). Only matters for a host that post-processes build output.\n- **Duplicate step or workflow IDs now fail the build.** In 4.x, two identically named non-exported functions across workspace files collided last-write-wins. If the build fails on this, rename one of them — do not suppress the check.\n- **`world-postgres` rows written before the upgrade.** Failed runs stored by 4.x read back with `error: undefined`, because the payload lives in the legacy `error` text column rather than `errorJson`. There is no data migration; recent-history dashboards may show blank errors for pre-upgrade failures.\n- **`world-local` stream chunks moved** to `streams\u002Fchunks\u002F\u003CstreamName>\u002F`. Files in the old flat layout are not read back and stale files are left in place — local development state, so deleting the data directory is fine.\n- **The workflow sandbox is stricter about nondeterminism.** `WeakRef`, `FinalizationRegistry`, `Atomics.waitAsync`, and async `WebAssembly` compilation are no longer available inside workflow functions, and `crypto.subtle.digest` computes synchronously (same results, deterministic timing). Grep `\"use workflow\"` files for these APIs; the fix is moving that code into a step, which is a design change — flag it, do not restructure unprompted.\n- **In-flight runs do not migrate.** Runs created on a 4.x deployment keep executing on that deployment. Let them finish where they started; do not add code to \"drain\" or re-target them.\n\n## Step 4 — custom `World` implementations\n\nOnly if the app implements `World` itself. **Use the `migrating-world-v4-to-v5` skill for this part** (`npx skills add https:\u002F\u002Fgithub.com\u002Fvercel\u002Fworkflow --skill migrating-world-v4-to-v5`); it carries the full World migration, including the event ID allocation work summarized below. What follows is enough to scope the job and to know when it has not been done.\n\nBeyond the stream and step signatures above, the interface gained:\n\n- `streams` as a namespace (see the table in step 2).\n- `analytics` — metadata-only listings for runs, steps, events, hooks, waits, and attributes.\n- attribute support on runs, including `experimentalSetAttributes`.\n- capability advertisement, so the runtime can gate optimizations. Unadvertised capabilities fail closed, which means an incomplete World stays correct but slower — advertise a capability only once it is genuinely implemented. Event ID allocation is not among them: it is a requirement, not a capability. A World that rejected stale writes behind the old `preconditionGuard` flag can delete that code, since the flag is gone and nothing replaced it.\n- an optional per-run event ceiling returned on run reads, which the runtime enforces.\n- optional `createRunId()` and a `region` on queue options, for worlds that place run state regionally.\n\nFour contract changes affect existing implementations. The first is required and is not visible from the type signatures:\n\n- **Event IDs are slots, and allocating them is mandatory.** An event ID is no longer a ULID the World mints freely: it is `evnt_` followed by the event's 1-based position in that run's log, zero-padded to 26 characters (`slotToEventId()` from `@workflow\u002Fworld` formats one). Positions must be unique and dense with no holes, so the race has to be settled in the store — a unique constraint on `(runId, eventId)` or a conditional write — rather than by reading the maximum in process and adding one. `events.create()` params carry `eventCount` to place the write; when that position is taken the World must not reject the create, it advances to the next free position, commits there, and returns the events occupying the skipped positions on the success response. Take the position *at the commit*, in the same operation that appends the event, since that is what stops an event landing behind a position a reader has already passed. There is no capability to declare and no fallback: the runtime reads a position out of every ID it loads and fails the run when it cannot, so a World whose IDs are not positions type-checks, starts runs, and fails on the first replay with `Event id is not slot-numbered`.\n\n  Warn the user that **runs already in their store cannot be replayed by the new code** — a ULID-numbered run is not readable as positions and the runtime refuses it, so those runs must be drained on 4.x first, unless the platform pins a run to its creating deployment (Vercel does, which resolves it). Point them at `@workflow\u002Fworld-testing`'s `numbers events by position`, which catches a wrong ID scheme in the conformance suite instead of at replay time, and at the \"Upgrading a World to v5\" guide for the full rules.\n\n- **Suspension and dispatch.** The asymmetric `{ timeoutSeconds }` return contract for waits is gone. Waits are ordinary queue continuations carrying `delaySeconds`, and wait plus step dispatch is unified into one parallel batch per suspension. A World that special-cased the old wait return needs rewriting against the current interface.\n- **Step queue topics are retired.** The `'step'` queue kind no longer exists: queued steps travel on the workflow topic (carrying `stepId`\u002F`stepName` in the payload) and execute in the combined flow handler. A World that provisioned or routed separate `__wkf_step_*` topics can drop them.\n- **World resolution happens at build time.** Worlds are statically injected into host bundles rather than selected dynamically at runtime, and first-party World packages expose a `createWorld()` factory. A custom or community World must be resolvable by the build; verify the app still boots against it rather than assuming a runtime lookup.\n\nOptional methods may be omitted; the runtime falls back. Point the user at the `migrating-world-v4-to-v5` skill and the \"Upgrading a World to v5\" guide, which carry the full interface delta and the contract changes above, rather than inventing method bodies.\n\n## Required output shape\n\nReturn the migration in this structure:\n\n```md\n## Summary\n## Dependency Changes\n## Code Changes\n## Behavior Changes To Review\n## Verification\n## Open Questions\n```\n\n- `## Code Changes` lists one entry per rule applied, with the file paths touched. Rules that did not apply are listed once as not applicable — do not omit them silently.\n- `## Behavior Changes To Review` carries the step 3 items that apply to this app, each with the concrete follow-up (which dashboard, which env var).\n- `## Open Questions` carries anything that could not be decided from the code, especially a custom World that needs interface work.\n\n## Verification\n\nRun, in order, and report actual output:\n\n1. Install and build. The build must regenerate workflow\u002Fstep bundles without errors.\n2. Typecheck. The async `getWorld()` change and the `steps.get` signature surface here.\n3. The app's test suite.\n4. Start the app and execute one real run end to end, confirming the first step runs and the run reaches a terminal state.\n\nFail the migration if any of these are true:\n\n- [ ] `workflow` and `@workflow\u002F*` versions span both 4.x and 5.x\n- [ ] `getWorld()` \u002F `createWorld()` \u002F `getWorldHandlers()` is called without `await`\n- [ ] `runStep` or `stepEntrypoint` is still imported\n- [ ] `createLocalWorld` or `createVercelWorld` is still imported\n- [ ] `workflow\u002Finternal\u002Fprivate` or `@workflow\u002Fcore\u002Fprivate` is still imported\n- [ ] a `world.streams.*` call kept the v4 argument order (name before runId)\n- [ ] `streams.get` was called without a `runId`\n- [ ] `world.steps.get` was called with `undefined` as its first argument\n- [ ] `NestLocalBuilder` is imported from `@workflow\u002Fnest` instead of `workflow\u002Fnest\u002Fbuilder`\n- [ ] a compiler call still passes `mode: 'client'`\n- [ ] a behavior change from step 3 was silently \"fixed\" instead of reported\n- [ ] workflow or step bodies were restructured beyond the rules above\n- [ ] generated output under `.well-known\u002Fworkflow\u002Fv1\u002F` was hand-edited\n- [ ] the build, typecheck, or test results were not actually run and reported\n\n## Reference\n\n- What's new in v5: \u003Chttps:\u002F\u002Fworkflow.dev\u002Fdocs\u002Fwhats-new>\n- Configuration and runtime tuning: \u003Chttps:\u002F\u002Fworkflow.dev\u002Fdocs\u002Fconfiguration>\n- Upgrading a World to v5: \u003Chttps:\u002F\u002Fworkflow.dev\u002Fworlds\u002Fupgrading-to-v5>\n- Building a World: \u003Chttps:\u002F\u002Fworkflow.dev\u002Fworlds\u002Fbuilding-a-world>\n- v4 documentation: \u003Chttps:\u002F\u002Fworkflow.dev\u002Fv4\u002Fdocs>\n",{"data":34,"body":38},{"name":4,"description":6,"metadata":35},{"author":36,"version":37},"Vercel Inc.","0.2.9",{"type":39,"children":40},"root",[41,50,96,101,176,181,188,193,517,522,528,569,714,727,739,745,750,769,872,901,920,932,1139,1158,1174,1179,1323,1338,1357,1375,1380,1402,1556,1583,1611,1628,1649,1794,1810,1822,1988,2005,2026,2327,2369,2386,2494,2530,2541,2569,2588,2696,2729,2735,2740,3077,3090,3124,3129,3205,3210,3399,3411,3417,3422,3504,3540,3546,3551,3589,3594,3861,3867,3927],{"type":42,"tag":43,"props":44,"children":46},"element","h1",{"id":45},"migrating-workflow-sdk-4x-to-50",[47],{"type":48,"value":49},"text","Migrating Workflow SDK 4.x to 5.0",{"type":42,"tag":51,"props":52,"children":53},"p",{},[54,56,63,65,71,73,79,80,86,88,94],{"type":48,"value":55},"Workflow SDK 5.0 keeps the programming model from 4.x. ",{"type":42,"tag":57,"props":58,"children":60},"code",{"className":59},[],[61],{"type":48,"value":62},"\"use workflow\"",{"type":48,"value":64}," \u002F ",{"type":42,"tag":57,"props":66,"children":68},{"className":67},[],[69],{"type":48,"value":70},"\"use step\"",{"type":48,"value":72},", ",{"type":42,"tag":57,"props":74,"children":76},{"className":75},[],[77],{"type":48,"value":78},"start()",{"type":48,"value":72},{"type":42,"tag":57,"props":81,"children":83},{"className":82},[],[84],{"type":48,"value":85},"getRun()",{"type":48,"value":87},", hooks, webhooks, streams, ",{"type":42,"tag":57,"props":89,"children":91},{"className":90},[],[92],{"type":48,"value":93},"sleep()",{"type":48,"value":95},", retries, and the event log are unchanged, so most application code compiles as-is.",{"type":42,"tag":51,"props":97,"children":98},{},[99],{"type":48,"value":100},"The breaking changes are concentrated in three places:",{"type":42,"tag":102,"props":103,"children":104},"ol",{},[105,132,158],{"type":42,"tag":106,"props":107,"children":108},"li",{},[109,115,117,123,124,130],{"type":42,"tag":110,"props":111,"children":112},"strong",{},[113],{"type":48,"value":114},"Runtime entrypoints",{"type":48,"value":116}," (",{"type":42,"tag":57,"props":118,"children":120},{"className":119},[],[121],{"type":48,"value":122},"workflow\u002Fapi",{"type":48,"value":72},{"type":42,"tag":57,"props":125,"children":127},{"className":126},[],[128],{"type":48,"value":129},"workflow\u002Fruntime",{"type":48,"value":131},") — two exports removed.",{"type":42,"tag":106,"props":133,"children":134},{},[135,148,150,156],{"type":42,"tag":110,"props":136,"children":137},{},[138,140,146],{"type":48,"value":139},"The ",{"type":42,"tag":57,"props":141,"children":143},{"className":142},[],[144],{"type":48,"value":145},"World",{"type":48,"value":147}," interface",{"type":48,"value":149}," — only relevant if the app implements a custom World or calls ",{"type":42,"tag":57,"props":151,"children":153},{"className":152},[],[154],{"type":48,"value":155},"getWorld()",{"type":48,"value":157}," directly.",{"type":42,"tag":106,"props":159,"children":160},{},[161,166,168,174],{"type":42,"tag":110,"props":162,"children":163},{},[164],{"type":48,"value":165},"Build integrations",{"type":48,"value":167}," — ",{"type":42,"tag":57,"props":169,"children":171},{"className":170},[],[172],{"type":48,"value":173},"@workflow\u002Fnest",{"type":48,"value":175}," subpaths, and private compiler subpaths that were never public.",{"type":42,"tag":51,"props":177,"children":178},{},[179],{"type":48,"value":180},"Do not rewrite workflow or step bodies. If you find yourself restructuring business logic, you have gone outside this migration.",{"type":42,"tag":182,"props":183,"children":185},"h2",{"id":184},"intake",[186],{"type":48,"value":187},"Intake",{"type":42,"tag":51,"props":189,"children":190},{},[191],{"type":48,"value":192},"Before editing, establish:",{"type":42,"tag":102,"props":194,"children":195},{},[196,229,338,382,441,465,496],{"type":42,"tag":106,"props":197,"children":198},{},[199,204,206,212,214,219,221,227],{"type":42,"tag":110,"props":200,"children":201},{},[202],{"type":48,"value":203},"Which packages are installed.",{"type":48,"value":205}," Read ",{"type":42,"tag":57,"props":207,"children":209},{"className":208},[],[210],{"type":48,"value":211},"package.json",{"type":48,"value":213}," for ",{"type":42,"tag":57,"props":215,"children":217},{"className":216},[],[218],{"type":48,"value":14},{"type":48,"value":220}," and every ",{"type":42,"tag":57,"props":222,"children":224},{"className":223},[],[225],{"type":48,"value":226},"@workflow\u002F*",{"type":48,"value":228}," dependency.",{"type":42,"tag":106,"props":230,"children":231},{},[232,237,239,245,246,252,253,259,260,266,267,273,274,280,281,287,288,294,295,301,302,308,309,315,316,322,323,329,330,336],{"type":42,"tag":110,"props":233,"children":234},{},[235],{"type":48,"value":236},"Whether the app touches the runtime.",{"type":48,"value":238}," Grep for ",{"type":42,"tag":57,"props":240,"children":242},{"className":241},[],[243],{"type":48,"value":244},"getWorld",{"type":48,"value":72},{"type":42,"tag":57,"props":247,"children":249},{"className":248},[],[250],{"type":48,"value":251},"createWorld",{"type":48,"value":72},{"type":42,"tag":57,"props":254,"children":256},{"className":255},[],[257],{"type":48,"value":258},"getWorldHandlers",{"type":48,"value":72},{"type":42,"tag":57,"props":261,"children":263},{"className":262},[],[264],{"type":48,"value":265},"writeToStream",{"type":48,"value":72},{"type":42,"tag":57,"props":268,"children":270},{"className":269},[],[271],{"type":48,"value":272},"readFromStream",{"type":48,"value":72},{"type":42,"tag":57,"props":275,"children":277},{"className":276},[],[278],{"type":48,"value":279},"closeStream",{"type":48,"value":72},{"type":42,"tag":57,"props":282,"children":284},{"className":283},[],[285],{"type":48,"value":286},"listStreamsByRunId",{"type":48,"value":72},{"type":42,"tag":57,"props":289,"children":291},{"className":290},[],[292],{"type":48,"value":293},"getStreamChunks",{"type":48,"value":72},{"type":42,"tag":57,"props":296,"children":298},{"className":297},[],[299],{"type":48,"value":300},"world.steps",{"type":48,"value":72},{"type":42,"tag":57,"props":303,"children":305},{"className":304},[],[306],{"type":48,"value":307},"listByCorrelationId",{"type":48,"value":72},{"type":42,"tag":57,"props":310,"children":312},{"className":311},[],[313],{"type":48,"value":314},"runStep",{"type":48,"value":72},{"type":42,"tag":57,"props":317,"children":319},{"className":318},[],[320],{"type":48,"value":321},"stepEntrypoint",{"type":48,"value":72},{"type":42,"tag":57,"props":324,"children":326},{"className":325},[],[327],{"type":48,"value":328},"internal\u002Fprivate",{"type":48,"value":72},{"type":42,"tag":57,"props":331,"children":333},{"className":332},[],[334],{"type":48,"value":335},"core\u002Fprivate",{"type":48,"value":337},".",{"type":42,"tag":106,"props":339,"children":340},{},[341,346,347,353,354,360,361,367,368,374,375,381],{"type":42,"tag":110,"props":342,"children":343},{},[344],{"type":48,"value":345},"Whether the app implements a custom World.",{"type":48,"value":238},{"type":42,"tag":57,"props":348,"children":350},{"className":349},[],[351],{"type":48,"value":352},"implements World",{"type":48,"value":72},{"type":42,"tag":57,"props":355,"children":357},{"className":356},[],[358],{"type":48,"value":359},": World",{"type":48,"value":72},{"type":42,"tag":57,"props":362,"children":364},{"className":363},[],[365],{"type":48,"value":366},"createLocalWorld",{"type":48,"value":72},{"type":42,"tag":57,"props":369,"children":371},{"className":370},[],[372],{"type":48,"value":373},"createVercelWorld",{"type":48,"value":72},{"type":42,"tag":57,"props":376,"children":378},{"className":377},[],[379],{"type":48,"value":380},"startWorkflowWorld",{"type":48,"value":337},{"type":42,"tag":106,"props":383,"children":384},{},[385,390,392,398,399,404,405,411,412,418,419,425,426,432,433,439],{"type":42,"tag":110,"props":386,"children":387},{},[388],{"type":48,"value":389},"Which framework integration is in use.",{"type":48,"value":391}," ",{"type":42,"tag":57,"props":393,"children":395},{"className":394},[],[396],{"type":48,"value":397},"@workflow\u002Fnext",{"type":48,"value":72},{"type":42,"tag":57,"props":400,"children":402},{"className":401},[],[403],{"type":48,"value":173},{"type":48,"value":72},{"type":42,"tag":57,"props":406,"children":408},{"className":407},[],[409],{"type":48,"value":410},"@workflow\u002Fnitro",{"type":48,"value":72},{"type":42,"tag":57,"props":413,"children":415},{"className":414},[],[416],{"type":48,"value":417},"@workflow\u002Fsveltekit",{"type":48,"value":72},{"type":42,"tag":57,"props":420,"children":422},{"className":421},[],[423],{"type":48,"value":424},"@workflow\u002Fvite",{"type":48,"value":72},{"type":42,"tag":57,"props":427,"children":429},{"className":428},[],[430],{"type":48,"value":431},"@workflow\u002Fnuxt",{"type":48,"value":72},{"type":42,"tag":57,"props":434,"children":436},{"className":435},[],[437],{"type":48,"value":438},"@workflow\u002Fastro",{"type":48,"value":440},", or the CLI.",{"type":42,"tag":106,"props":442,"children":443},{},[444,457,458,464],{"type":42,"tag":110,"props":445,"children":446},{},[447,449,455],{"type":48,"value":448},"Whether ",{"type":42,"tag":57,"props":450,"children":452},{"className":451},[],[453],{"type":48,"value":454},"hook.getConflict()",{"type":48,"value":456}," is used.",{"type":48,"value":238},{"type":42,"tag":57,"props":459,"children":461},{"className":460},[],[462],{"type":48,"value":463},"getConflict",{"type":48,"value":337},{"type":42,"tag":106,"props":466,"children":467},{},[468,473,474,480,481,487,488,494],{"type":42,"tag":110,"props":469,"children":470},{},[471],{"type":48,"value":472},"Whether the app calls the compiler directly.",{"type":48,"value":238},{"type":42,"tag":57,"props":475,"children":477},{"className":476},[],[478],{"type":48,"value":479},"mode: 'client'",{"type":48,"value":72},{"type":42,"tag":57,"props":482,"children":484},{"className":483},[],[485],{"type":48,"value":486},"transformSync",{"type":48,"value":72},{"type":42,"tag":57,"props":489,"children":491},{"className":490},[],[492],{"type":48,"value":493},"swc-plugin-workflow",{"type":48,"value":495},". Only custom build integrations do this.",{"type":42,"tag":106,"props":497,"children":498},{},[499,510,511,516],{"type":42,"tag":110,"props":500,"children":501},{},[502,503,509],{"type":48,"value":448},{"type":42,"tag":57,"props":504,"children":506},{"className":505},[],[507],{"type":48,"value":508},"experimental_setAttributes",{"type":48,"value":456},{"type":48,"value":238},{"type":42,"tag":57,"props":512,"children":514},{"className":513},[],[515],{"type":48,"value":508},{"type":48,"value":337},{"type":42,"tag":51,"props":518,"children":519},{},[520],{"type":48,"value":521},"Report anything in 2–7 that the app does not use as \"not applicable\" rather than silently skipping it.",{"type":42,"tag":182,"props":523,"children":525},{"id":524},"step-1-bump-the-dependencies",[526],{"type":48,"value":527},"Step 1 — bump the dependencies",{"type":42,"tag":51,"props":529,"children":530},{},[531,533,538,540,545,547,553,555,560,562,567],{"type":48,"value":532},"Move every ",{"type":42,"tag":57,"props":534,"children":536},{"className":535},[],[537],{"type":48,"value":14},{"type":48,"value":539}," and ",{"type":42,"tag":57,"props":541,"children":543},{"className":542},[],[544],{"type":48,"value":226},{"type":48,"value":546}," dependency to ",{"type":42,"tag":57,"props":548,"children":550},{"className":549},[],[551],{"type":48,"value":552},"^5.0.0",{"type":48,"value":554},". They are released together and must not be mixed across majors — a 4.x ",{"type":42,"tag":57,"props":556,"children":558},{"className":557},[],[559],{"type":48,"value":397},{"type":48,"value":561}," against a 5.x ",{"type":42,"tag":57,"props":563,"children":565},{"className":564},[],[566],{"type":48,"value":14},{"type":48,"value":568}," will fail at build time.",{"type":42,"tag":570,"props":571,"children":576},"pre",{"className":572,"code":573,"language":574,"meta":575,"style":575},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"dependencies\": {\n    \"workflow\": \"^5.0.0\",\n    \"@workflow\u002Fnext\": \"^5.0.0\"\n  }\n}\n","json","",[577],{"type":42,"tag":57,"props":578,"children":579},{"__ignoreMap":575},[580,592,622,663,696,705],{"type":42,"tag":581,"props":582,"children":585},"span",{"class":583,"line":584},"line",1,[586],{"type":42,"tag":581,"props":587,"children":589},{"style":588},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[590],{"type":48,"value":591},"{\n",{"type":42,"tag":581,"props":593,"children":595},{"class":583,"line":594},2,[596,601,607,612,617],{"type":42,"tag":581,"props":597,"children":598},{"style":588},[599],{"type":48,"value":600},"  \"",{"type":42,"tag":581,"props":602,"children":604},{"style":603},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[605],{"type":48,"value":606},"dependencies",{"type":42,"tag":581,"props":608,"children":609},{"style":588},[610],{"type":48,"value":611},"\"",{"type":42,"tag":581,"props":613,"children":614},{"style":588},[615],{"type":48,"value":616},":",{"type":42,"tag":581,"props":618,"children":619},{"style":588},[620],{"type":48,"value":621}," {\n",{"type":42,"tag":581,"props":623,"children":625},{"class":583,"line":624},3,[626,631,636,640,644,649,654,658],{"type":42,"tag":581,"props":627,"children":628},{"style":588},[629],{"type":48,"value":630},"    \"",{"type":42,"tag":581,"props":632,"children":634},{"style":633},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[635],{"type":48,"value":14},{"type":42,"tag":581,"props":637,"children":638},{"style":588},[639],{"type":48,"value":611},{"type":42,"tag":581,"props":641,"children":642},{"style":588},[643],{"type":48,"value":616},{"type":42,"tag":581,"props":645,"children":646},{"style":588},[647],{"type":48,"value":648}," \"",{"type":42,"tag":581,"props":650,"children":652},{"style":651},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[653],{"type":48,"value":552},{"type":42,"tag":581,"props":655,"children":656},{"style":588},[657],{"type":48,"value":611},{"type":42,"tag":581,"props":659,"children":660},{"style":588},[661],{"type":48,"value":662},",\n",{"type":42,"tag":581,"props":664,"children":666},{"class":583,"line":665},4,[667,671,675,679,683,687,691],{"type":42,"tag":581,"props":668,"children":669},{"style":588},[670],{"type":48,"value":630},{"type":42,"tag":581,"props":672,"children":673},{"style":633},[674],{"type":48,"value":397},{"type":42,"tag":581,"props":676,"children":677},{"style":588},[678],{"type":48,"value":611},{"type":42,"tag":581,"props":680,"children":681},{"style":588},[682],{"type":48,"value":616},{"type":42,"tag":581,"props":684,"children":685},{"style":588},[686],{"type":48,"value":648},{"type":42,"tag":581,"props":688,"children":689},{"style":651},[690],{"type":48,"value":552},{"type":42,"tag":581,"props":692,"children":693},{"style":588},[694],{"type":48,"value":695},"\"\n",{"type":42,"tag":581,"props":697,"children":699},{"class":583,"line":698},5,[700],{"type":42,"tag":581,"props":701,"children":702},{"style":588},[703],{"type":48,"value":704},"  }\n",{"type":42,"tag":581,"props":706,"children":708},{"class":583,"line":707},6,[709],{"type":42,"tag":581,"props":710,"children":711},{"style":588},[712],{"type":48,"value":713},"}\n",{"type":42,"tag":51,"props":715,"children":716},{},[717,719,725],{"type":48,"value":718},"Then reinstall and rebuild so the compiler regenerates the workflow\u002Fstep bundles and the generated routes under ",{"type":42,"tag":57,"props":720,"children":722},{"className":721},[],[723],{"type":48,"value":724},".well-known\u002Fworkflow\u002Fv1\u002F",{"type":48,"value":726},". Never hand-edit generated output.",{"type":42,"tag":51,"props":728,"children":729},{},[730,732,738],{"type":48,"value":731},"Node requirements are unchanged: ",{"type":42,"tag":57,"props":733,"children":735},{"className":734},[],[736],{"type":48,"value":737},"^18 || ^20 || ^22 || ^24",{"type":48,"value":337},{"type":42,"tag":182,"props":740,"children":742},{"id":741},"step-2-apply-the-mechanical-rewrites",[743],{"type":48,"value":744},"Step 2 — apply the mechanical rewrites",{"type":42,"tag":51,"props":746,"children":747},{},[748],{"type":48,"value":749},"Apply each rule only where the pattern actually appears.",{"type":42,"tag":751,"props":752,"children":754},"h3",{"id":753},"getworld-and-createworld-are-async",[755,760,761,767],{"type":42,"tag":57,"props":756,"children":758},{"className":757},[],[759],{"type":48,"value":155},{"type":48,"value":539},{"type":42,"tag":57,"props":762,"children":764},{"className":763},[],[765],{"type":48,"value":766},"createWorld()",{"type":48,"value":768}," are async",{"type":42,"tag":570,"props":770,"children":774},{"className":771,"code":772,"language":773,"meta":575,"style":575},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F v4\nconst world = getWorld();\n\n\u002F\u002F v5\nconst world = await getWorld();\n","ts",[775],{"type":42,"tag":57,"props":776,"children":777},{"__ignoreMap":575},[778,787,822,831,839],{"type":42,"tag":581,"props":779,"children":780},{"class":583,"line":584},[781],{"type":42,"tag":581,"props":782,"children":784},{"style":783},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[785],{"type":48,"value":786},"\u002F\u002F v4\n",{"type":42,"tag":581,"props":788,"children":789},{"class":583,"line":594},[790,795,801,806,812,817],{"type":42,"tag":581,"props":791,"children":792},{"style":603},[793],{"type":48,"value":794},"const",{"type":42,"tag":581,"props":796,"children":798},{"style":797},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[799],{"type":48,"value":800}," world ",{"type":42,"tag":581,"props":802,"children":803},{"style":588},[804],{"type":48,"value":805},"=",{"type":42,"tag":581,"props":807,"children":809},{"style":808},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[810],{"type":48,"value":811}," getWorld",{"type":42,"tag":581,"props":813,"children":814},{"style":797},[815],{"type":48,"value":816},"()",{"type":42,"tag":581,"props":818,"children":819},{"style":588},[820],{"type":48,"value":821},";\n",{"type":42,"tag":581,"props":823,"children":824},{"class":583,"line":624},[825],{"type":42,"tag":581,"props":826,"children":828},{"emptyLinePlaceholder":827},true,[829],{"type":48,"value":830},"\n",{"type":42,"tag":581,"props":832,"children":833},{"class":583,"line":665},[834],{"type":42,"tag":581,"props":835,"children":836},{"style":783},[837],{"type":48,"value":838},"\u002F\u002F v5\n",{"type":42,"tag":581,"props":840,"children":841},{"class":583,"line":698},[842,846,850,854,860,864,868],{"type":42,"tag":581,"props":843,"children":844},{"style":603},[845],{"type":48,"value":794},{"type":42,"tag":581,"props":847,"children":848},{"style":797},[849],{"type":48,"value":800},{"type":42,"tag":581,"props":851,"children":852},{"style":588},[853],{"type":48,"value":805},{"type":42,"tag":581,"props":855,"children":857},{"style":856},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[858],{"type":48,"value":859}," await",{"type":42,"tag":581,"props":861,"children":862},{"style":808},[863],{"type":48,"value":811},{"type":42,"tag":581,"props":865,"children":866},{"style":797},[867],{"type":48,"value":816},{"type":42,"tag":581,"props":869,"children":870},{"style":588},[871],{"type":48,"value":821},{"type":42,"tag":51,"props":873,"children":874},{},[875,877,883,885,891,893,899],{"type":48,"value":876},"This also applies to ",{"type":42,"tag":57,"props":878,"children":880},{"className":879},[],[881],{"type":48,"value":882},"getWorldHandlers()",{"type":48,"value":884},". Awaiting was already correct in 4.x, so this edit is safe to make before the dependency bump. Propagate ",{"type":42,"tag":57,"props":886,"children":888},{"className":887},[],[889],{"type":48,"value":890},"async",{"type":48,"value":892}," up the call chain rather than wrapping in ",{"type":42,"tag":57,"props":894,"children":896},{"className":895},[],[897],{"type":48,"value":898},".then()",{"type":48,"value":900}," chains.",{"type":42,"tag":751,"props":902,"children":904},{"id":903},"createlocalworld-and-createvercelworld-removed",[905,911,912,918],{"type":42,"tag":57,"props":906,"children":908},{"className":907},[],[909],{"type":48,"value":910},"createLocalWorld()",{"type":48,"value":539},{"type":42,"tag":57,"props":913,"children":915},{"className":914},[],[916],{"type":48,"value":917},"createVercelWorld()",{"type":48,"value":919}," removed",{"type":42,"tag":51,"props":921,"children":922},{},[923,925,930],{"type":48,"value":924},"First-party World packages now expose a single ",{"type":42,"tag":57,"props":926,"children":928},{"className":927},[],[929],{"type":48,"value":766},{"type":48,"value":931}," factory. The arguments are unchanged — this is a rename only.",{"type":42,"tag":570,"props":933,"children":935},{"className":771,"code":934,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nimport { createLocalWorld } from '@workflow\u002Fworld-local';\nconst world = createLocalWorld({ dataDir });\n\n\u002F\u002F v5\nimport { createWorld } from '@workflow\u002Fworld-local';\nconst world = createWorld({ dataDir });\n",[936],{"type":42,"tag":57,"props":937,"children":938},{"__ignoreMap":575},[939,946,993,1041,1048,1055,1095],{"type":42,"tag":581,"props":940,"children":941},{"class":583,"line":584},[942],{"type":42,"tag":581,"props":943,"children":944},{"style":783},[945],{"type":48,"value":786},{"type":42,"tag":581,"props":947,"children":948},{"class":583,"line":594},[949,954,959,964,969,974,979,984,989],{"type":42,"tag":581,"props":950,"children":951},{"style":856},[952],{"type":48,"value":953},"import",{"type":42,"tag":581,"props":955,"children":956},{"style":588},[957],{"type":48,"value":958}," {",{"type":42,"tag":581,"props":960,"children":961},{"style":797},[962],{"type":48,"value":963}," createLocalWorld",{"type":42,"tag":581,"props":965,"children":966},{"style":588},[967],{"type":48,"value":968}," }",{"type":42,"tag":581,"props":970,"children":971},{"style":856},[972],{"type":48,"value":973}," from",{"type":42,"tag":581,"props":975,"children":976},{"style":588},[977],{"type":48,"value":978}," '",{"type":42,"tag":581,"props":980,"children":981},{"style":651},[982],{"type":48,"value":983},"@workflow\u002Fworld-local",{"type":42,"tag":581,"props":985,"children":986},{"style":588},[987],{"type":48,"value":988},"'",{"type":42,"tag":581,"props":990,"children":991},{"style":588},[992],{"type":48,"value":821},{"type":42,"tag":581,"props":994,"children":995},{"class":583,"line":624},[996,1000,1004,1008,1012,1017,1022,1027,1032,1037],{"type":42,"tag":581,"props":997,"children":998},{"style":603},[999],{"type":48,"value":794},{"type":42,"tag":581,"props":1001,"children":1002},{"style":797},[1003],{"type":48,"value":800},{"type":42,"tag":581,"props":1005,"children":1006},{"style":588},[1007],{"type":48,"value":805},{"type":42,"tag":581,"props":1009,"children":1010},{"style":808},[1011],{"type":48,"value":963},{"type":42,"tag":581,"props":1013,"children":1014},{"style":797},[1015],{"type":48,"value":1016},"(",{"type":42,"tag":581,"props":1018,"children":1019},{"style":588},[1020],{"type":48,"value":1021},"{",{"type":42,"tag":581,"props":1023,"children":1024},{"style":797},[1025],{"type":48,"value":1026}," dataDir ",{"type":42,"tag":581,"props":1028,"children":1029},{"style":588},[1030],{"type":48,"value":1031},"}",{"type":42,"tag":581,"props":1033,"children":1034},{"style":797},[1035],{"type":48,"value":1036},")",{"type":42,"tag":581,"props":1038,"children":1039},{"style":588},[1040],{"type":48,"value":821},{"type":42,"tag":581,"props":1042,"children":1043},{"class":583,"line":665},[1044],{"type":42,"tag":581,"props":1045,"children":1046},{"emptyLinePlaceholder":827},[1047],{"type":48,"value":830},{"type":42,"tag":581,"props":1049,"children":1050},{"class":583,"line":698},[1051],{"type":42,"tag":581,"props":1052,"children":1053},{"style":783},[1054],{"type":48,"value":838},{"type":42,"tag":581,"props":1056,"children":1057},{"class":583,"line":707},[1058,1062,1066,1071,1075,1079,1083,1087,1091],{"type":42,"tag":581,"props":1059,"children":1060},{"style":856},[1061],{"type":48,"value":953},{"type":42,"tag":581,"props":1063,"children":1064},{"style":588},[1065],{"type":48,"value":958},{"type":42,"tag":581,"props":1067,"children":1068},{"style":797},[1069],{"type":48,"value":1070}," createWorld",{"type":42,"tag":581,"props":1072,"children":1073},{"style":588},[1074],{"type":48,"value":968},{"type":42,"tag":581,"props":1076,"children":1077},{"style":856},[1078],{"type":48,"value":973},{"type":42,"tag":581,"props":1080,"children":1081},{"style":588},[1082],{"type":48,"value":978},{"type":42,"tag":581,"props":1084,"children":1085},{"style":651},[1086],{"type":48,"value":983},{"type":42,"tag":581,"props":1088,"children":1089},{"style":588},[1090],{"type":48,"value":988},{"type":42,"tag":581,"props":1092,"children":1093},{"style":588},[1094],{"type":48,"value":821},{"type":42,"tag":581,"props":1096,"children":1098},{"class":583,"line":1097},7,[1099,1103,1107,1111,1115,1119,1123,1127,1131,1135],{"type":42,"tag":581,"props":1100,"children":1101},{"style":603},[1102],{"type":48,"value":794},{"type":42,"tag":581,"props":1104,"children":1105},{"style":797},[1106],{"type":48,"value":800},{"type":42,"tag":581,"props":1108,"children":1109},{"style":588},[1110],{"type":48,"value":805},{"type":42,"tag":581,"props":1112,"children":1113},{"style":808},[1114],{"type":48,"value":1070},{"type":42,"tag":581,"props":1116,"children":1117},{"style":797},[1118],{"type":48,"value":1016},{"type":42,"tag":581,"props":1120,"children":1121},{"style":588},[1122],{"type":48,"value":1021},{"type":42,"tag":581,"props":1124,"children":1125},{"style":797},[1126],{"type":48,"value":1026},{"type":42,"tag":581,"props":1128,"children":1129},{"style":588},[1130],{"type":48,"value":1031},{"type":42,"tag":581,"props":1132,"children":1133},{"style":797},[1134],{"type":48,"value":1036},{"type":42,"tag":581,"props":1136,"children":1137},{"style":588},[1138],{"type":48,"value":821},{"type":42,"tag":51,"props":1140,"children":1141},{},[1142,1144,1149,1151,1157],{"type":48,"value":1143},"The same applies to ",{"type":42,"tag":57,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":48,"value":373},{"type":48,"value":1150}," from ",{"type":42,"tag":57,"props":1152,"children":1154},{"className":1153},[],[1155],{"type":48,"value":1156},"@workflow\u002Fworld-vercel",{"type":48,"value":337},{"type":42,"tag":751,"props":1159,"children":1161},{"id":1160},"runstep-removed-from-workflowapi",[1162,1167,1169],{"type":42,"tag":57,"props":1163,"children":1165},{"className":1164},[],[1166],{"type":48,"value":314},{"type":48,"value":1168}," removed from ",{"type":42,"tag":57,"props":1170,"children":1172},{"className":1171},[],[1173],{"type":48,"value":122},{"type":42,"tag":51,"props":1175,"children":1176},{},[1177],{"type":48,"value":1178},"Call the step function directly. The compiler routes the call through the step runtime.",{"type":42,"tag":570,"props":1180,"children":1182},{"className":771,"code":1181,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nimport { runStep } from 'workflow\u002Fapi';\nconst result = await runStep(chargeCard, [orderId]);\n\n\u002F\u002F v5\nconst result = await chargeCard(orderId);\n",[1183],{"type":42,"tag":57,"props":1184,"children":1185},{"__ignoreMap":575},[1186,1193,1233,1276,1283,1290],{"type":42,"tag":581,"props":1187,"children":1188},{"class":583,"line":584},[1189],{"type":42,"tag":581,"props":1190,"children":1191},{"style":783},[1192],{"type":48,"value":786},{"type":42,"tag":581,"props":1194,"children":1195},{"class":583,"line":594},[1196,1200,1204,1209,1213,1217,1221,1225,1229],{"type":42,"tag":581,"props":1197,"children":1198},{"style":856},[1199],{"type":48,"value":953},{"type":42,"tag":581,"props":1201,"children":1202},{"style":588},[1203],{"type":48,"value":958},{"type":42,"tag":581,"props":1205,"children":1206},{"style":797},[1207],{"type":48,"value":1208}," runStep",{"type":42,"tag":581,"props":1210,"children":1211},{"style":588},[1212],{"type":48,"value":968},{"type":42,"tag":581,"props":1214,"children":1215},{"style":856},[1216],{"type":48,"value":973},{"type":42,"tag":581,"props":1218,"children":1219},{"style":588},[1220],{"type":48,"value":978},{"type":42,"tag":581,"props":1222,"children":1223},{"style":651},[1224],{"type":48,"value":122},{"type":42,"tag":581,"props":1226,"children":1227},{"style":588},[1228],{"type":48,"value":988},{"type":42,"tag":581,"props":1230,"children":1231},{"style":588},[1232],{"type":48,"value":821},{"type":42,"tag":581,"props":1234,"children":1235},{"class":583,"line":624},[1236,1240,1245,1249,1253,1257,1262,1267,1272],{"type":42,"tag":581,"props":1237,"children":1238},{"style":603},[1239],{"type":48,"value":794},{"type":42,"tag":581,"props":1241,"children":1242},{"style":797},[1243],{"type":48,"value":1244}," result ",{"type":42,"tag":581,"props":1246,"children":1247},{"style":588},[1248],{"type":48,"value":805},{"type":42,"tag":581,"props":1250,"children":1251},{"style":856},[1252],{"type":48,"value":859},{"type":42,"tag":581,"props":1254,"children":1255},{"style":808},[1256],{"type":48,"value":1208},{"type":42,"tag":581,"props":1258,"children":1259},{"style":797},[1260],{"type":48,"value":1261},"(chargeCard",{"type":42,"tag":581,"props":1263,"children":1264},{"style":588},[1265],{"type":48,"value":1266},",",{"type":42,"tag":581,"props":1268,"children":1269},{"style":797},[1270],{"type":48,"value":1271}," [orderId])",{"type":42,"tag":581,"props":1273,"children":1274},{"style":588},[1275],{"type":48,"value":821},{"type":42,"tag":581,"props":1277,"children":1278},{"class":583,"line":665},[1279],{"type":42,"tag":581,"props":1280,"children":1281},{"emptyLinePlaceholder":827},[1282],{"type":48,"value":830},{"type":42,"tag":581,"props":1284,"children":1285},{"class":583,"line":698},[1286],{"type":42,"tag":581,"props":1287,"children":1288},{"style":783},[1289],{"type":48,"value":838},{"type":42,"tag":581,"props":1291,"children":1292},{"class":583,"line":707},[1293,1297,1301,1305,1309,1314,1319],{"type":42,"tag":581,"props":1294,"children":1295},{"style":603},[1296],{"type":48,"value":794},{"type":42,"tag":581,"props":1298,"children":1299},{"style":797},[1300],{"type":48,"value":1244},{"type":42,"tag":581,"props":1302,"children":1303},{"style":588},[1304],{"type":48,"value":805},{"type":42,"tag":581,"props":1306,"children":1307},{"style":856},[1308],{"type":48,"value":859},{"type":42,"tag":581,"props":1310,"children":1311},{"style":808},[1312],{"type":48,"value":1313}," chargeCard",{"type":42,"tag":581,"props":1315,"children":1316},{"style":797},[1317],{"type":48,"value":1318},"(orderId)",{"type":42,"tag":581,"props":1320,"children":1321},{"style":588},[1322],{"type":48,"value":821},{"type":42,"tag":751,"props":1324,"children":1326},{"id":1325},"stepentrypoint-removed-from-workflowruntime",[1327,1332,1333],{"type":42,"tag":57,"props":1328,"children":1330},{"className":1329},[],[1331],{"type":48,"value":321},{"type":48,"value":1168},{"type":42,"tag":57,"props":1334,"children":1336},{"className":1335},[],[1337],{"type":48,"value":129},{"type":42,"tag":51,"props":1339,"children":1340},{},[1341,1343,1348,1350,1355],{"type":48,"value":1342},"Framework integrations generate step routes themselves — delete hand-written step routes that existed only to call ",{"type":42,"tag":57,"props":1344,"children":1346},{"className":1345},[],[1347],{"type":48,"value":321},{"type":48,"value":1349},". For a custom host, serve the handlers from ",{"type":42,"tag":57,"props":1351,"children":1353},{"className":1352},[],[1354],{"type":48,"value":882},{"type":48,"value":1356}," instead.",{"type":42,"tag":751,"props":1358,"children":1360},{"id":1359},"workflowinternalprivate-and-workflowcoreprivate-removed",[1361,1367,1368,1374],{"type":42,"tag":57,"props":1362,"children":1364},{"className":1363},[],[1365],{"type":48,"value":1366},"workflow\u002Finternal\u002Fprivate",{"type":48,"value":539},{"type":42,"tag":57,"props":1369,"children":1371},{"className":1370},[],[1372],{"type":48,"value":1373},"@workflow\u002Fcore\u002Fprivate",{"type":48,"value":919},{"type":42,"tag":51,"props":1376,"children":1377},{},[1378],{"type":48,"value":1379},"These subpaths were never public API. Remove the imports; if generated build output still references them, it is stale — reinstall and rebuild rather than restoring the imports.",{"type":42,"tag":751,"props":1381,"children":1383},{"id":1382},"stream-methods-moved-to-worldstreams-with-runid-first",[1384,1386,1392,1394,1400],{"type":48,"value":1385},"Stream methods moved to ",{"type":42,"tag":57,"props":1387,"children":1389},{"className":1388},[],[1390],{"type":48,"value":1391},"world.streams.*",{"type":48,"value":1393}," with ",{"type":42,"tag":57,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":48,"value":1399},"runId",{"type":48,"value":1401}," first",{"type":42,"tag":1403,"props":1404,"children":1405},"table",{},[1406,1425],{"type":42,"tag":1407,"props":1408,"children":1409},"thead",{},[1410],{"type":42,"tag":1411,"props":1412,"children":1413},"tr",{},[1414,1420],{"type":42,"tag":1415,"props":1416,"children":1417},"th",{},[1418],{"type":48,"value":1419},"v4",{"type":42,"tag":1415,"props":1421,"children":1422},{},[1423],{"type":48,"value":1424},"v5",{"type":42,"tag":1426,"props":1427,"children":1428},"tbody",{},[1429,1451,1472,1493,1514,1535],{"type":42,"tag":1411,"props":1430,"children":1431},{},[1432,1442],{"type":42,"tag":1433,"props":1434,"children":1435},"td",{},[1436],{"type":42,"tag":57,"props":1437,"children":1439},{"className":1438},[],[1440],{"type":48,"value":1441},"world.writeToStream(name, runId, chunk)",{"type":42,"tag":1433,"props":1443,"children":1444},{},[1445],{"type":42,"tag":57,"props":1446,"children":1448},{"className":1447},[],[1449],{"type":48,"value":1450},"world.streams.write(runId, name, chunk)",{"type":42,"tag":1411,"props":1452,"children":1453},{},[1454,1463],{"type":42,"tag":1433,"props":1455,"children":1456},{},[1457],{"type":42,"tag":57,"props":1458,"children":1460},{"className":1459},[],[1461],{"type":48,"value":1462},"world.writeToStreamMulti(name, runId, chunks)",{"type":42,"tag":1433,"props":1464,"children":1465},{},[1466],{"type":42,"tag":57,"props":1467,"children":1469},{"className":1468},[],[1470],{"type":48,"value":1471},"world.streams.writeMulti(runId, name, chunks)",{"type":42,"tag":1411,"props":1473,"children":1474},{},[1475,1484],{"type":42,"tag":1433,"props":1476,"children":1477},{},[1478],{"type":42,"tag":57,"props":1479,"children":1481},{"className":1480},[],[1482],{"type":48,"value":1483},"world.closeStream(name, runId)",{"type":42,"tag":1433,"props":1485,"children":1486},{},[1487],{"type":42,"tag":57,"props":1488,"children":1490},{"className":1489},[],[1491],{"type":48,"value":1492},"world.streams.close(runId, name)",{"type":42,"tag":1411,"props":1494,"children":1495},{},[1496,1505],{"type":42,"tag":1433,"props":1497,"children":1498},{},[1499],{"type":42,"tag":57,"props":1500,"children":1502},{"className":1501},[],[1503],{"type":48,"value":1504},"world.readFromStream(name, startIndex?)",{"type":42,"tag":1433,"props":1506,"children":1507},{},[1508],{"type":42,"tag":57,"props":1509,"children":1511},{"className":1510},[],[1512],{"type":48,"value":1513},"world.streams.get(runId, name, startIndex?)",{"type":42,"tag":1411,"props":1515,"children":1516},{},[1517,1526],{"type":42,"tag":1433,"props":1518,"children":1519},{},[1520],{"type":42,"tag":57,"props":1521,"children":1523},{"className":1522},[],[1524],{"type":48,"value":1525},"world.getStreamChunks(name, runId, options?)",{"type":42,"tag":1433,"props":1527,"children":1528},{},[1529],{"type":42,"tag":57,"props":1530,"children":1532},{"className":1531},[],[1533],{"type":48,"value":1534},"world.streams.getChunks(runId, name, options?)",{"type":42,"tag":1411,"props":1536,"children":1537},{},[1538,1547],{"type":42,"tag":1433,"props":1539,"children":1540},{},[1541],{"type":42,"tag":57,"props":1542,"children":1544},{"className":1543},[],[1545],{"type":48,"value":1546},"world.listStreamsByRunId(runId)",{"type":42,"tag":1433,"props":1548,"children":1549},{},[1550],{"type":42,"tag":57,"props":1551,"children":1553},{"className":1552},[],[1554],{"type":48,"value":1555},"world.streams.list(runId)",{"type":42,"tag":51,"props":1557,"children":1558},{},[1559,1561,1566,1568,1573,1575,1581],{"type":48,"value":1560},"The argument order flipped, so a rename alone silently passes a stream name where a run ID is expected. Swap the arguments at every call site. ",{"type":42,"tag":57,"props":1562,"children":1564},{"className":1563},[],[1565],{"type":48,"value":272},{"type":48,"value":1567}," had no ",{"type":42,"tag":57,"props":1569,"children":1571},{"className":1570},[],[1572],{"type":48,"value":1399},{"type":48,"value":1574}," parameter at all — ",{"type":42,"tag":57,"props":1576,"children":1578},{"className":1577},[],[1579],{"type":48,"value":1580},"streams.get",{"type":48,"value":1582}," requires one, so thread the owning run ID through to the call.",{"type":42,"tag":51,"props":1584,"children":1585},{},[1586,1588,1594,1596,1602,1604,1609],{"type":48,"value":1587},"Application code that uses ",{"type":42,"tag":57,"props":1589,"children":1591},{"className":1590},[],[1592],{"type":48,"value":1593},"getWritable()",{"type":48,"value":1595}," inside a workflow or reads ",{"type":42,"tag":57,"props":1597,"children":1599},{"className":1598},[],[1600],{"type":48,"value":1601},"run.readable",{"type":48,"value":1603}," is unaffected; this rule is only for direct ",{"type":42,"tag":57,"props":1605,"children":1607},{"className":1606},[],[1608],{"type":48,"value":145},{"type":48,"value":1610}," access.",{"type":42,"tag":751,"props":1612,"children":1614},{"id":1613},"worldstepsget-requires-a-runid",[1615,1621,1623],{"type":42,"tag":57,"props":1616,"children":1618},{"className":1617},[],[1619],{"type":48,"value":1620},"world.steps.get()",{"type":48,"value":1622}," requires a ",{"type":42,"tag":57,"props":1624,"children":1626},{"className":1625},[],[1627],{"type":48,"value":1399},{"type":42,"tag":51,"props":1629,"children":1630},{},[1631,1633,1639,1641,1647],{"type":48,"value":1632},"The first parameter was ",{"type":42,"tag":57,"props":1634,"children":1636},{"className":1635},[],[1637],{"type":48,"value":1638},"string | undefined",{"type":48,"value":1640}," and is now ",{"type":42,"tag":57,"props":1642,"children":1644},{"className":1643},[],[1645],{"type":48,"value":1646},"string",{"type":48,"value":1648},". Pass the run ID that owns the step.",{"type":42,"tag":570,"props":1650,"children":1652},{"className":771,"code":1651,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nconst step = await world.steps.get(undefined, stepId);\n\n\u002F\u002F v5\nconst step = await world.steps.get(runId, stepId);\n",[1653],{"type":42,"tag":57,"props":1654,"children":1655},{"__ignoreMap":575},[1656,1663,1724,1731,1738],{"type":42,"tag":581,"props":1657,"children":1658},{"class":583,"line":584},[1659],{"type":42,"tag":581,"props":1660,"children":1661},{"style":783},[1662],{"type":48,"value":786},{"type":42,"tag":581,"props":1664,"children":1665},{"class":583,"line":594},[1666,1670,1675,1679,1683,1688,1692,1697,1701,1706,1710,1715,1720],{"type":42,"tag":581,"props":1667,"children":1668},{"style":603},[1669],{"type":48,"value":794},{"type":42,"tag":581,"props":1671,"children":1672},{"style":797},[1673],{"type":48,"value":1674}," step ",{"type":42,"tag":581,"props":1676,"children":1677},{"style":588},[1678],{"type":48,"value":805},{"type":42,"tag":581,"props":1680,"children":1681},{"style":856},[1682],{"type":48,"value":859},{"type":42,"tag":581,"props":1684,"children":1685},{"style":797},[1686],{"type":48,"value":1687}," world",{"type":42,"tag":581,"props":1689,"children":1690},{"style":588},[1691],{"type":48,"value":337},{"type":42,"tag":581,"props":1693,"children":1694},{"style":797},[1695],{"type":48,"value":1696},"steps",{"type":42,"tag":581,"props":1698,"children":1699},{"style":588},[1700],{"type":48,"value":337},{"type":42,"tag":581,"props":1702,"children":1703},{"style":808},[1704],{"type":48,"value":1705},"get",{"type":42,"tag":581,"props":1707,"children":1708},{"style":797},[1709],{"type":48,"value":1016},{"type":42,"tag":581,"props":1711,"children":1712},{"style":588},[1713],{"type":48,"value":1714},"undefined,",{"type":42,"tag":581,"props":1716,"children":1717},{"style":797},[1718],{"type":48,"value":1719}," stepId)",{"type":42,"tag":581,"props":1721,"children":1722},{"style":588},[1723],{"type":48,"value":821},{"type":42,"tag":581,"props":1725,"children":1726},{"class":583,"line":624},[1727],{"type":42,"tag":581,"props":1728,"children":1729},{"emptyLinePlaceholder":827},[1730],{"type":48,"value":830},{"type":42,"tag":581,"props":1732,"children":1733},{"class":583,"line":665},[1734],{"type":42,"tag":581,"props":1735,"children":1736},{"style":783},[1737],{"type":48,"value":838},{"type":42,"tag":581,"props":1739,"children":1740},{"class":583,"line":698},[1741,1745,1749,1753,1757,1761,1765,1769,1773,1777,1782,1786,1790],{"type":42,"tag":581,"props":1742,"children":1743},{"style":603},[1744],{"type":48,"value":794},{"type":42,"tag":581,"props":1746,"children":1747},{"style":797},[1748],{"type":48,"value":1674},{"type":42,"tag":581,"props":1750,"children":1751},{"style":588},[1752],{"type":48,"value":805},{"type":42,"tag":581,"props":1754,"children":1755},{"style":856},[1756],{"type":48,"value":859},{"type":42,"tag":581,"props":1758,"children":1759},{"style":797},[1760],{"type":48,"value":1687},{"type":42,"tag":581,"props":1762,"children":1763},{"style":588},[1764],{"type":48,"value":337},{"type":42,"tag":581,"props":1766,"children":1767},{"style":797},[1768],{"type":48,"value":1696},{"type":42,"tag":581,"props":1770,"children":1771},{"style":588},[1772],{"type":48,"value":337},{"type":42,"tag":581,"props":1774,"children":1775},{"style":808},[1776],{"type":48,"value":1705},{"type":42,"tag":581,"props":1778,"children":1779},{"style":797},[1780],{"type":48,"value":1781},"(runId",{"type":42,"tag":581,"props":1783,"children":1784},{"style":588},[1785],{"type":48,"value":1266},{"type":42,"tag":581,"props":1787,"children":1788},{"style":797},[1789],{"type":48,"value":1719},{"type":42,"tag":581,"props":1791,"children":1792},{"style":588},[1793],{"type":48,"value":821},{"type":42,"tag":751,"props":1795,"children":1797},{"id":1796},"eventslistbycorrelationid-requires-a-runid",[1798,1804,1805],{"type":42,"tag":57,"props":1799,"children":1801},{"className":1800},[],[1802],{"type":48,"value":1803},"events.listByCorrelationId()",{"type":48,"value":1622},{"type":42,"tag":57,"props":1806,"children":1808},{"className":1807},[],[1809],{"type":48,"value":1399},{"type":42,"tag":51,"props":1811,"children":1812},{},[1813,1815,1821],{"type":48,"value":1814},"A correlation ID identifies a step, hook or wait within its run, not across runs. The lookup is scoped to one run, so pass the run that owns the ID. The same applies to ",{"type":42,"tag":57,"props":1816,"children":1818},{"className":1817},[],[1819],{"type":48,"value":1820},"analytics.events.listByCorrelationId()",{"type":48,"value":337},{"type":42,"tag":570,"props":1823,"children":1825},{"className":771,"code":1824,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nconst events = await world.events.listByCorrelationId({ correlationId });\n\n\u002F\u002F v5\nconst events = await world.events.listByCorrelationId({ runId, correlationId });\n",[1826],{"type":42,"tag":57,"props":1827,"children":1828},{"__ignoreMap":575},[1829,1836,1902,1909,1916],{"type":42,"tag":581,"props":1830,"children":1831},{"class":583,"line":584},[1832],{"type":42,"tag":581,"props":1833,"children":1834},{"style":783},[1835],{"type":48,"value":786},{"type":42,"tag":581,"props":1837,"children":1838},{"class":583,"line":594},[1839,1843,1848,1852,1856,1860,1864,1869,1873,1877,1881,1885,1890,1894,1898],{"type":42,"tag":581,"props":1840,"children":1841},{"style":603},[1842],{"type":48,"value":794},{"type":42,"tag":581,"props":1844,"children":1845},{"style":797},[1846],{"type":48,"value":1847}," events ",{"type":42,"tag":581,"props":1849,"children":1850},{"style":588},[1851],{"type":48,"value":805},{"type":42,"tag":581,"props":1853,"children":1854},{"style":856},[1855],{"type":48,"value":859},{"type":42,"tag":581,"props":1857,"children":1858},{"style":797},[1859],{"type":48,"value":1687},{"type":42,"tag":581,"props":1861,"children":1862},{"style":588},[1863],{"type":48,"value":337},{"type":42,"tag":581,"props":1865,"children":1866},{"style":797},[1867],{"type":48,"value":1868},"events",{"type":42,"tag":581,"props":1870,"children":1871},{"style":588},[1872],{"type":48,"value":337},{"type":42,"tag":581,"props":1874,"children":1875},{"style":808},[1876],{"type":48,"value":307},{"type":42,"tag":581,"props":1878,"children":1879},{"style":797},[1880],{"type":48,"value":1016},{"type":42,"tag":581,"props":1882,"children":1883},{"style":588},[1884],{"type":48,"value":1021},{"type":42,"tag":581,"props":1886,"children":1887},{"style":797},[1888],{"type":48,"value":1889}," correlationId ",{"type":42,"tag":581,"props":1891,"children":1892},{"style":588},[1893],{"type":48,"value":1031},{"type":42,"tag":581,"props":1895,"children":1896},{"style":797},[1897],{"type":48,"value":1036},{"type":42,"tag":581,"props":1899,"children":1900},{"style":588},[1901],{"type":48,"value":821},{"type":42,"tag":581,"props":1903,"children":1904},{"class":583,"line":624},[1905],{"type":42,"tag":581,"props":1906,"children":1907},{"emptyLinePlaceholder":827},[1908],{"type":48,"value":830},{"type":42,"tag":581,"props":1910,"children":1911},{"class":583,"line":665},[1912],{"type":42,"tag":581,"props":1913,"children":1914},{"style":783},[1915],{"type":48,"value":838},{"type":42,"tag":581,"props":1917,"children":1918},{"class":583,"line":698},[1919,1923,1927,1931,1935,1939,1943,1947,1951,1955,1959,1963,1968,1972,1976,1980,1984],{"type":42,"tag":581,"props":1920,"children":1921},{"style":603},[1922],{"type":48,"value":794},{"type":42,"tag":581,"props":1924,"children":1925},{"style":797},[1926],{"type":48,"value":1847},{"type":42,"tag":581,"props":1928,"children":1929},{"style":588},[1930],{"type":48,"value":805},{"type":42,"tag":581,"props":1932,"children":1933},{"style":856},[1934],{"type":48,"value":859},{"type":42,"tag":581,"props":1936,"children":1937},{"style":797},[1938],{"type":48,"value":1687},{"type":42,"tag":581,"props":1940,"children":1941},{"style":588},[1942],{"type":48,"value":337},{"type":42,"tag":581,"props":1944,"children":1945},{"style":797},[1946],{"type":48,"value":1868},{"type":42,"tag":581,"props":1948,"children":1949},{"style":588},[1950],{"type":48,"value":337},{"type":42,"tag":581,"props":1952,"children":1953},{"style":808},[1954],{"type":48,"value":307},{"type":42,"tag":581,"props":1956,"children":1957},{"style":797},[1958],{"type":48,"value":1016},{"type":42,"tag":581,"props":1960,"children":1961},{"style":588},[1962],{"type":48,"value":1021},{"type":42,"tag":581,"props":1964,"children":1965},{"style":797},[1966],{"type":48,"value":1967}," runId",{"type":42,"tag":581,"props":1969,"children":1970},{"style":588},[1971],{"type":48,"value":1266},{"type":42,"tag":581,"props":1973,"children":1974},{"style":797},[1975],{"type":48,"value":1889},{"type":42,"tag":581,"props":1977,"children":1978},{"style":588},[1979],{"type":48,"value":1031},{"type":42,"tag":581,"props":1981,"children":1982},{"style":797},[1983],{"type":48,"value":1036},{"type":42,"tag":581,"props":1985,"children":1986},{"style":588},[1987],{"type":48,"value":821},{"type":42,"tag":751,"props":1989,"children":1991},{"id":1990},"hookgetconflict-resolves-with-a-run",[1992,1997,1999],{"type":42,"tag":57,"props":1993,"children":1995},{"className":1994},[],[1996],{"type":48,"value":454},{"type":48,"value":1998}," resolves with a ",{"type":42,"tag":57,"props":2000,"children":2002},{"className":2001},[],[2003],{"type":48,"value":2004},"Run",{"type":42,"tag":51,"props":2006,"children":2007},{},[2008,2010,2016,2018,2024],{"type":48,"value":2009},"The resolved value is now the conflicting run handle rather than ",{"type":42,"tag":57,"props":2011,"children":2013},{"className":2012},[],[2014],{"type":48,"value":2015},"{ runId }",{"type":48,"value":2017},". ",{"type":42,"tag":57,"props":2019,"children":2021},{"className":2020},[],[2022],{"type":48,"value":2023},"conflict.runId",{"type":48,"value":2025}," still reads the same, so existing code keeps working — but the round trip through a step to fetch the run can be deleted.",{"type":42,"tag":570,"props":2027,"children":2029},{"className":771,"code":2028,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nconst conflict = await hook.getConflict();\nif (conflict) {\n  const run = await fetchRun(conflict.runId); \u002F\u002F \"use step\" wrapper around getRun()\n  return { dedupedTo: await run.returnValue };\n}\n\n\u002F\u002F v5\nconst conflict = await hook.getConflict();\nif (conflict) {\n  return { dedupedTo: await conflict.returnValue };\n}\n",[2030],{"type":42,"tag":57,"props":2031,"children":2032},{"__ignoreMap":575},[2033,2040,2081,2098,2157,2200,2207,2214,2222,2262,2278,2319],{"type":42,"tag":581,"props":2034,"children":2035},{"class":583,"line":584},[2036],{"type":42,"tag":581,"props":2037,"children":2038},{"style":783},[2039],{"type":48,"value":786},{"type":42,"tag":581,"props":2041,"children":2042},{"class":583,"line":594},[2043,2047,2052,2056,2060,2065,2069,2073,2077],{"type":42,"tag":581,"props":2044,"children":2045},{"style":603},[2046],{"type":48,"value":794},{"type":42,"tag":581,"props":2048,"children":2049},{"style":797},[2050],{"type":48,"value":2051}," conflict ",{"type":42,"tag":581,"props":2053,"children":2054},{"style":588},[2055],{"type":48,"value":805},{"type":42,"tag":581,"props":2057,"children":2058},{"style":856},[2059],{"type":48,"value":859},{"type":42,"tag":581,"props":2061,"children":2062},{"style":797},[2063],{"type":48,"value":2064}," hook",{"type":42,"tag":581,"props":2066,"children":2067},{"style":588},[2068],{"type":48,"value":337},{"type":42,"tag":581,"props":2070,"children":2071},{"style":808},[2072],{"type":48,"value":463},{"type":42,"tag":581,"props":2074,"children":2075},{"style":797},[2076],{"type":48,"value":816},{"type":42,"tag":581,"props":2078,"children":2079},{"style":588},[2080],{"type":48,"value":821},{"type":42,"tag":581,"props":2082,"children":2083},{"class":583,"line":624},[2084,2089,2094],{"type":42,"tag":581,"props":2085,"children":2086},{"style":856},[2087],{"type":48,"value":2088},"if",{"type":42,"tag":581,"props":2090,"children":2091},{"style":797},[2092],{"type":48,"value":2093}," (conflict) ",{"type":42,"tag":581,"props":2095,"children":2096},{"style":588},[2097],{"type":48,"value":591},{"type":42,"tag":581,"props":2099,"children":2100},{"class":583,"line":665},[2101,2106,2111,2116,2120,2125,2130,2135,2139,2143,2147,2152],{"type":42,"tag":581,"props":2102,"children":2103},{"style":603},[2104],{"type":48,"value":2105},"  const",{"type":42,"tag":581,"props":2107,"children":2108},{"style":797},[2109],{"type":48,"value":2110}," run",{"type":42,"tag":581,"props":2112,"children":2113},{"style":588},[2114],{"type":48,"value":2115}," =",{"type":42,"tag":581,"props":2117,"children":2118},{"style":856},[2119],{"type":48,"value":859},{"type":42,"tag":581,"props":2121,"children":2122},{"style":808},[2123],{"type":48,"value":2124}," fetchRun",{"type":42,"tag":581,"props":2126,"children":2128},{"style":2127},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2129],{"type":48,"value":1016},{"type":42,"tag":581,"props":2131,"children":2132},{"style":797},[2133],{"type":48,"value":2134},"conflict",{"type":42,"tag":581,"props":2136,"children":2137},{"style":588},[2138],{"type":48,"value":337},{"type":42,"tag":581,"props":2140,"children":2141},{"style":797},[2142],{"type":48,"value":1399},{"type":42,"tag":581,"props":2144,"children":2145},{"style":2127},[2146],{"type":48,"value":1036},{"type":42,"tag":581,"props":2148,"children":2149},{"style":588},[2150],{"type":48,"value":2151},";",{"type":42,"tag":581,"props":2153,"children":2154},{"style":783},[2155],{"type":48,"value":2156}," \u002F\u002F \"use step\" wrapper around getRun()\n",{"type":42,"tag":581,"props":2158,"children":2159},{"class":583,"line":698},[2160,2165,2169,2174,2178,2182,2186,2190,2195],{"type":42,"tag":581,"props":2161,"children":2162},{"style":856},[2163],{"type":48,"value":2164},"  return",{"type":42,"tag":581,"props":2166,"children":2167},{"style":588},[2168],{"type":48,"value":958},{"type":42,"tag":581,"props":2170,"children":2171},{"style":2127},[2172],{"type":48,"value":2173}," dedupedTo",{"type":42,"tag":581,"props":2175,"children":2176},{"style":588},[2177],{"type":48,"value":616},{"type":42,"tag":581,"props":2179,"children":2180},{"style":856},[2181],{"type":48,"value":859},{"type":42,"tag":581,"props":2183,"children":2184},{"style":797},[2185],{"type":48,"value":2110},{"type":42,"tag":581,"props":2187,"children":2188},{"style":588},[2189],{"type":48,"value":337},{"type":42,"tag":581,"props":2191,"children":2192},{"style":797},[2193],{"type":48,"value":2194},"returnValue",{"type":42,"tag":581,"props":2196,"children":2197},{"style":588},[2198],{"type":48,"value":2199}," };\n",{"type":42,"tag":581,"props":2201,"children":2202},{"class":583,"line":707},[2203],{"type":42,"tag":581,"props":2204,"children":2205},{"style":588},[2206],{"type":48,"value":713},{"type":42,"tag":581,"props":2208,"children":2209},{"class":583,"line":1097},[2210],{"type":42,"tag":581,"props":2211,"children":2212},{"emptyLinePlaceholder":827},[2213],{"type":48,"value":830},{"type":42,"tag":581,"props":2215,"children":2217},{"class":583,"line":2216},8,[2218],{"type":42,"tag":581,"props":2219,"children":2220},{"style":783},[2221],{"type":48,"value":838},{"type":42,"tag":581,"props":2223,"children":2225},{"class":583,"line":2224},9,[2226,2230,2234,2238,2242,2246,2250,2254,2258],{"type":42,"tag":581,"props":2227,"children":2228},{"style":603},[2229],{"type":48,"value":794},{"type":42,"tag":581,"props":2231,"children":2232},{"style":797},[2233],{"type":48,"value":2051},{"type":42,"tag":581,"props":2235,"children":2236},{"style":588},[2237],{"type":48,"value":805},{"type":42,"tag":581,"props":2239,"children":2240},{"style":856},[2241],{"type":48,"value":859},{"type":42,"tag":581,"props":2243,"children":2244},{"style":797},[2245],{"type":48,"value":2064},{"type":42,"tag":581,"props":2247,"children":2248},{"style":588},[2249],{"type":48,"value":337},{"type":42,"tag":581,"props":2251,"children":2252},{"style":808},[2253],{"type":48,"value":463},{"type":42,"tag":581,"props":2255,"children":2256},{"style":797},[2257],{"type":48,"value":816},{"type":42,"tag":581,"props":2259,"children":2260},{"style":588},[2261],{"type":48,"value":821},{"type":42,"tag":581,"props":2263,"children":2265},{"class":583,"line":2264},10,[2266,2270,2274],{"type":42,"tag":581,"props":2267,"children":2268},{"style":856},[2269],{"type":48,"value":2088},{"type":42,"tag":581,"props":2271,"children":2272},{"style":797},[2273],{"type":48,"value":2093},{"type":42,"tag":581,"props":2275,"children":2276},{"style":588},[2277],{"type":48,"value":591},{"type":42,"tag":581,"props":2279,"children":2281},{"class":583,"line":2280},11,[2282,2286,2290,2294,2298,2302,2307,2311,2315],{"type":42,"tag":581,"props":2283,"children":2284},{"style":856},[2285],{"type":48,"value":2164},{"type":42,"tag":581,"props":2287,"children":2288},{"style":588},[2289],{"type":48,"value":958},{"type":42,"tag":581,"props":2291,"children":2292},{"style":2127},[2293],{"type":48,"value":2173},{"type":42,"tag":581,"props":2295,"children":2296},{"style":588},[2297],{"type":48,"value":616},{"type":42,"tag":581,"props":2299,"children":2300},{"style":856},[2301],{"type":48,"value":859},{"type":42,"tag":581,"props":2303,"children":2304},{"style":797},[2305],{"type":48,"value":2306}," conflict",{"type":42,"tag":581,"props":2308,"children":2309},{"style":588},[2310],{"type":48,"value":337},{"type":42,"tag":581,"props":2312,"children":2313},{"style":797},[2314],{"type":48,"value":2194},{"type":42,"tag":581,"props":2316,"children":2317},{"style":588},[2318],{"type":48,"value":2199},{"type":42,"tag":581,"props":2320,"children":2322},{"class":583,"line":2321},12,[2323],{"type":42,"tag":581,"props":2324,"children":2325},{"style":588},[2326],{"type":48,"value":713},{"type":42,"tag":51,"props":2328,"children":2329},{},[2330,2336,2337,2343,2345,2351,2353,2359,2361,2367],{"type":42,"tag":57,"props":2331,"children":2333},{"className":2332},[],[2334],{"type":48,"value":2335},"await conflict.status",{"type":48,"value":539},{"type":42,"tag":57,"props":2338,"children":2340},{"className":2339},[],[2341],{"type":48,"value":2342},"await conflict.cancel()",{"type":48,"value":2344}," are available on the same handle. Do not remove the ",{"type":42,"tag":57,"props":2346,"children":2348},{"className":2347},[],[2349],{"type":48,"value":2350},"if (conflict)",{"type":48,"value":2352}," null check — ",{"type":42,"tag":57,"props":2354,"children":2356},{"className":2355},[],[2357],{"type":48,"value":2358},"getConflict()",{"type":48,"value":2360}," still resolves ",{"type":42,"tag":57,"props":2362,"children":2364},{"className":2363},[],[2365],{"type":48,"value":2366},"null",{"type":48,"value":2368}," when the token was claimed cleanly.",{"type":42,"tag":751,"props":2370,"children":2372},{"id":2371},"experimental_setattributes-renamed-to-setattributes",[2373,2378,2380],{"type":42,"tag":57,"props":2374,"children":2376},{"className":2375},[],[2377],{"type":48,"value":508},{"type":48,"value":2379}," renamed to ",{"type":42,"tag":57,"props":2381,"children":2383},{"className":2382},[],[2384],{"type":48,"value":2385},"setAttributes",{"type":42,"tag":570,"props":2387,"children":2389},{"className":771,"code":2388,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nimport { experimental_setAttributes } from 'workflow';\n\n\u002F\u002F v5\nimport { setAttributes } from 'workflow';\n",[2390],{"type":42,"tag":57,"props":2391,"children":2392},{"__ignoreMap":575},[2393,2400,2440,2447,2454],{"type":42,"tag":581,"props":2394,"children":2395},{"class":583,"line":584},[2396],{"type":42,"tag":581,"props":2397,"children":2398},{"style":783},[2399],{"type":48,"value":786},{"type":42,"tag":581,"props":2401,"children":2402},{"class":583,"line":594},[2403,2407,2411,2416,2420,2424,2428,2432,2436],{"type":42,"tag":581,"props":2404,"children":2405},{"style":856},[2406],{"type":48,"value":953},{"type":42,"tag":581,"props":2408,"children":2409},{"style":588},[2410],{"type":48,"value":958},{"type":42,"tag":581,"props":2412,"children":2413},{"style":797},[2414],{"type":48,"value":2415}," experimental_setAttributes",{"type":42,"tag":581,"props":2417,"children":2418},{"style":588},[2419],{"type":48,"value":968},{"type":42,"tag":581,"props":2421,"children":2422},{"style":856},[2423],{"type":48,"value":973},{"type":42,"tag":581,"props":2425,"children":2426},{"style":588},[2427],{"type":48,"value":978},{"type":42,"tag":581,"props":2429,"children":2430},{"style":651},[2431],{"type":48,"value":14},{"type":42,"tag":581,"props":2433,"children":2434},{"style":588},[2435],{"type":48,"value":988},{"type":42,"tag":581,"props":2437,"children":2438},{"style":588},[2439],{"type":48,"value":821},{"type":42,"tag":581,"props":2441,"children":2442},{"class":583,"line":624},[2443],{"type":42,"tag":581,"props":2444,"children":2445},{"emptyLinePlaceholder":827},[2446],{"type":48,"value":830},{"type":42,"tag":581,"props":2448,"children":2449},{"class":583,"line":665},[2450],{"type":42,"tag":581,"props":2451,"children":2452},{"style":783},[2453],{"type":48,"value":838},{"type":42,"tag":581,"props":2455,"children":2456},{"class":583,"line":698},[2457,2461,2465,2470,2474,2478,2482,2486,2490],{"type":42,"tag":581,"props":2458,"children":2459},{"style":856},[2460],{"type":48,"value":953},{"type":42,"tag":581,"props":2462,"children":2463},{"style":588},[2464],{"type":48,"value":958},{"type":42,"tag":581,"props":2466,"children":2467},{"style":797},[2468],{"type":48,"value":2469}," setAttributes",{"type":42,"tag":581,"props":2471,"children":2472},{"style":588},[2473],{"type":48,"value":968},{"type":42,"tag":581,"props":2475,"children":2476},{"style":856},[2477],{"type":48,"value":973},{"type":42,"tag":581,"props":2479,"children":2480},{"style":588},[2481],{"type":48,"value":978},{"type":42,"tag":581,"props":2483,"children":2484},{"style":651},[2485],{"type":48,"value":14},{"type":42,"tag":581,"props":2487,"children":2488},{"style":588},[2489],{"type":48,"value":988},{"type":42,"tag":581,"props":2491,"children":2492},{"style":588},[2493],{"type":48,"value":821},{"type":42,"tag":51,"props":2495,"children":2496},{},[2497,2499,2505,2507,2513,2515,2521,2523,2528],{"type":48,"value":2498},"The old name was removed in v5, so this rewrite is required. ",{"type":42,"tag":57,"props":2500,"children":2502},{"className":2501},[],[2503],{"type":48,"value":2504},"ExperimentalSetAttributesOptions",{"type":48,"value":2506}," is likewise now ",{"type":42,"tag":57,"props":2508,"children":2510},{"className":2509},[],[2511],{"type":48,"value":2512},"SetAttributesOptions",{"type":48,"value":2514},". The ",{"type":42,"tag":57,"props":2516,"children":2518},{"className":2517},[],[2519],{"type":48,"value":2520},"attributes",{"type":48,"value":2522}," option on ",{"type":42,"tag":57,"props":2524,"children":2526},{"className":2525},[],[2527],{"type":48,"value":78},{"type":48,"value":2529}," is unchanged.",{"type":42,"tag":751,"props":2531,"children":2533},{"id":2532},"mode-client-removed-from-the-swc-transform",[2534,2539],{"type":42,"tag":57,"props":2535,"children":2537},{"className":2536},[],[2538],{"type":48,"value":479},{"type":48,"value":2540}," removed from the SWC transform",{"type":42,"tag":51,"props":2542,"children":2543},{},[2544,2546,2552,2554,2560,2562,2568],{"type":48,"value":2545},"Only relevant to a custom build integration that calls the compiler itself. The ",{"type":42,"tag":57,"props":2547,"children":2549},{"className":2548},[],[2550],{"type":48,"value":2551},"client",{"type":48,"value":2553}," mode merged into ",{"type":42,"tag":57,"props":2555,"children":2557},{"className":2556},[],[2558],{"type":48,"value":2559},"step",{"type":48,"value":2561},", which now absorbs hoisted variable references and dead-code elimination. Pass ",{"type":42,"tag":57,"props":2563,"children":2565},{"className":2564},[],[2566],{"type":48,"value":2567},"mode: 'step'",{"type":48,"value":337},{"type":42,"tag":751,"props":2570,"children":2572},{"id":2571},"nestlocalbuilder-moved-out-of-the-workflownest-root",[2573,2579,2581,2586],{"type":42,"tag":57,"props":2574,"children":2576},{"className":2575},[],[2577],{"type":48,"value":2578},"NestLocalBuilder",{"type":48,"value":2580}," moved out of the ",{"type":42,"tag":57,"props":2582,"children":2584},{"className":2583},[],[2585],{"type":48,"value":173},{"type":48,"value":2587}," root",{"type":42,"tag":570,"props":2589,"children":2591},{"className":771,"code":2590,"language":773,"meta":575,"style":575},"\u002F\u002F v4\nimport { NestLocalBuilder } from '@workflow\u002Fnest';\n\n\u002F\u002F v5\nimport { NestLocalBuilder } from 'workflow\u002Fnest\u002Fbuilder';\n",[2592],{"type":42,"tag":57,"props":2593,"children":2594},{"__ignoreMap":575},[2595,2602,2642,2649,2656],{"type":42,"tag":581,"props":2596,"children":2597},{"class":583,"line":584},[2598],{"type":42,"tag":581,"props":2599,"children":2600},{"style":783},[2601],{"type":48,"value":786},{"type":42,"tag":581,"props":2603,"children":2604},{"class":583,"line":594},[2605,2609,2613,2618,2622,2626,2630,2634,2638],{"type":42,"tag":581,"props":2606,"children":2607},{"style":856},[2608],{"type":48,"value":953},{"type":42,"tag":581,"props":2610,"children":2611},{"style":588},[2612],{"type":48,"value":958},{"type":42,"tag":581,"props":2614,"children":2615},{"style":797},[2616],{"type":48,"value":2617}," NestLocalBuilder",{"type":42,"tag":581,"props":2619,"children":2620},{"style":588},[2621],{"type":48,"value":968},{"type":42,"tag":581,"props":2623,"children":2624},{"style":856},[2625],{"type":48,"value":973},{"type":42,"tag":581,"props":2627,"children":2628},{"style":588},[2629],{"type":48,"value":978},{"type":42,"tag":581,"props":2631,"children":2632},{"style":651},[2633],{"type":48,"value":173},{"type":42,"tag":581,"props":2635,"children":2636},{"style":588},[2637],{"type":48,"value":988},{"type":42,"tag":581,"props":2639,"children":2640},{"style":588},[2641],{"type":48,"value":821},{"type":42,"tag":581,"props":2643,"children":2644},{"class":583,"line":624},[2645],{"type":42,"tag":581,"props":2646,"children":2647},{"emptyLinePlaceholder":827},[2648],{"type":48,"value":830},{"type":42,"tag":581,"props":2650,"children":2651},{"class":583,"line":665},[2652],{"type":42,"tag":581,"props":2653,"children":2654},{"style":783},[2655],{"type":48,"value":838},{"type":42,"tag":581,"props":2657,"children":2658},{"class":583,"line":698},[2659,2663,2667,2671,2675,2679,2683,2688,2692],{"type":42,"tag":581,"props":2660,"children":2661},{"style":856},[2662],{"type":48,"value":953},{"type":42,"tag":581,"props":2664,"children":2665},{"style":588},[2666],{"type":48,"value":958},{"type":42,"tag":581,"props":2668,"children":2669},{"style":797},[2670],{"type":48,"value":2617},{"type":42,"tag":581,"props":2672,"children":2673},{"style":588},[2674],{"type":48,"value":968},{"type":42,"tag":581,"props":2676,"children":2677},{"style":856},[2678],{"type":48,"value":973},{"type":42,"tag":581,"props":2680,"children":2681},{"style":588},[2682],{"type":48,"value":978},{"type":42,"tag":581,"props":2684,"children":2685},{"style":651},[2686],{"type":48,"value":2687},"workflow\u002Fnest\u002Fbuilder",{"type":42,"tag":581,"props":2689,"children":2690},{"style":588},[2691],{"type":48,"value":988},{"type":42,"tag":581,"props":2693,"children":2694},{"style":588},[2695],{"type":48,"value":821},{"type":42,"tag":51,"props":2697,"children":2698},{},[2699,2705,2707,2713,2714,2720,2722,2727],{"type":42,"tag":57,"props":2700,"children":2702},{"className":2701},[],[2703],{"type":48,"value":2704},"NestVercelBuilder",{"type":48,"value":2706}," lives at ",{"type":42,"tag":57,"props":2708,"children":2710},{"className":2709},[],[2711],{"type":48,"value":2712},"workflow\u002Fnest\u002Fvercel-builder",{"type":48,"value":2017},{"type":42,"tag":57,"props":2715,"children":2717},{"className":2716},[],[2718],{"type":48,"value":2719},"WorkflowModule",{"type":48,"value":2721}," still comes from ",{"type":42,"tag":57,"props":2723,"children":2725},{"className":2724},[],[2726],{"type":48,"value":173},{"type":48,"value":2728},"; the split keeps the build toolchain out of the runtime bundle, so do not re-export the builder from a module that runtime code imports.",{"type":42,"tag":182,"props":2730,"children":2732},{"id":2731},"step-3-flag-the-behavior-changes-that-need-a-decision",[2733],{"type":48,"value":2734},"Step 3 — flag the behavior changes that need a decision",{"type":42,"tag":51,"props":2736,"children":2737},{},[2738],{"type":48,"value":2739},"These are not code edits. Report each one that applies, and do not \"fix\" them silently.",{"type":42,"tag":2741,"props":2742,"children":2743},"ul",{},[2744,2777,2794,2820,2853,2886,2904,2929,2939,2949,2989,3013,3067],{"type":42,"tag":106,"props":2745,"children":2746},{},[2747,2759,2761,2767,2769,2775],{"type":42,"tag":110,"props":2748,"children":2749},{},[2750,2752,2758],{"type":48,"value":2751},"Tracing defaults to ",{"type":42,"tag":57,"props":2753,"children":2755},{"className":2754},[],[2756],{"type":48,"value":2757},"linked",{"type":48,"value":337},{"type":48,"value":2760}," Each workflow and step invocation is its own trace root with span links to the enqueue site and the run origin, instead of one trace per run. If the app has dashboards, saved queries, or alerts keyed on a single trace ID per run, either move them to the ",{"type":42,"tag":57,"props":2762,"children":2764},{"className":2763},[],[2765],{"type":48,"value":2766},"workflow.run.id",{"type":48,"value":2768}," attribute or set ",{"type":42,"tag":57,"props":2770,"children":2772},{"className":2771},[],[2773],{"type":48,"value":2774},"WORKFLOW_TRACE_MODE=continuous",{"type":48,"value":2776}," to restore the 4.x shape.",{"type":42,"tag":106,"props":2778,"children":2779},{},[2780,2785,2786,2792],{"type":42,"tag":110,"props":2781,"children":2782},{},[2783],{"type":48,"value":2784},"The event-creation precondition guard is gone.",{"type":48,"value":391},{"type":42,"tag":57,"props":2787,"children":2789},{"className":2788},[],[2790],{"type":48,"value":2791},"WORKFLOW_PRECONDITION_GUARD",{"type":48,"value":2793}," no longer exists; remove it from the app's environment and deployment config if it is set. No World in the SDK rejects a write for a stale snapshot any more — a replay that is behind learns what it missed from the write it makes next.",{"type":42,"tag":106,"props":2795,"children":2796},{},[2797,2802,2804,2810,2812,2818],{"type":42,"tag":110,"props":2798,"children":2799},{},[2800],{"type":48,"value":2801},"Turbo mode is on by default.",{"type":48,"value":2803}," The first invocation of a run backgrounds ",{"type":42,"tag":57,"props":2805,"children":2807},{"className":2806},[],[2808],{"type":48,"value":2809},"run_started",{"type":48,"value":2811}," and skips the initial event-log load. ",{"type":42,"tag":57,"props":2813,"children":2815},{"className":2814},[],[2816],{"type":48,"value":2817},"WORKFLOW_TURBO=0",{"type":48,"value":2819}," disables it.",{"type":42,"tag":106,"props":2821,"children":2822},{},[2823,2828,2829,2835,2837,2843,2845,2851],{"type":42,"tag":110,"props":2824,"children":2825},{},[2826],{"type":48,"value":2827},"Errors keep their type.",{"type":48,"value":391},{"type":42,"tag":57,"props":2830,"children":2832},{"className":2831},[],[2833],{"type":48,"value":2834},"WorkflowRunFailedError.cause",{"type":48,"value":2836}," now preserves the original class identity and cause chain. Code that pattern-matched on ",{"type":42,"tag":57,"props":2838,"children":2840},{"className":2839},[],[2841],{"type":48,"value":2842},"error.message",{"type":48,"value":2844}," because the class was flattened in 4.x can use ",{"type":42,"tag":57,"props":2846,"children":2848},{"className":2847},[],[2849],{"type":48,"value":2850},"instanceof",{"type":48,"value":2852}," — but flag it rather than rewriting error handling unprompted.",{"type":42,"tag":106,"props":2854,"children":2855},{},[2856,2861,2863,2869,2871,2876,2878,2884],{"type":42,"tag":110,"props":2857,"children":2858},{},[2859],{"type":48,"value":2860},"Event IDs are slot numbers, not ULIDs.",{"type":48,"value":2862}," An event ID is now its 1-based position in the run's log (",{"type":42,"tag":57,"props":2864,"children":2866},{"className":2865},[],[2867],{"type":48,"value":2868},"evnt_00000000000000000000000042",{"type":48,"value":2870},"), unique only within a run and carrying no timestamp. Report any app code that uses an event ID as a global key (pair it with the ",{"type":42,"tag":57,"props":2872,"children":2874},{"className":2873},[],[2875],{"type":48,"value":1399},{"type":48,"value":2877},") or decodes a time out of one (read ",{"type":42,"tag":57,"props":2879,"children":2881},{"className":2880},[],[2882],{"type":48,"value":2883},"createdAt",{"type":48,"value":2885}," off the event). Other entity IDs are unchanged.",{"type":42,"tag":106,"props":2887,"children":2888},{},[2889,2894,2896,2902],{"type":42,"tag":110,"props":2890,"children":2891},{},[2892],{"type":48,"value":2893},"A per-run event limit is enforced.",{"type":48,"value":2895}," The World supplies the ceiling (25,000 events on the Local and Vercel Worlds) and a run that reaches it fails with ",{"type":42,"tag":57,"props":2897,"children":2899},{"className":2898},[],[2900],{"type":48,"value":2901},"MAX_EVENTS_EXCEEDED",{"type":48,"value":2903},". Flag any workflow with an unbounded loop; the fix is a child run per batch, which is a design change, not a migration edit.",{"type":42,"tag":106,"props":2905,"children":2906},{},[2907,2912,2914,2920,2922,2928],{"type":42,"tag":110,"props":2908,"children":2909},{},[2910],{"type":48,"value":2911},"Stream writes flush the leading chunk immediately.",{"type":48,"value":2913}," The flush window default went from 10ms to 0. An app that relied on the window to coalesce a burst of tiny chunks can set ",{"type":42,"tag":57,"props":2915,"children":2917},{"className":2916},[],[2918],{"type":48,"value":2919},"streamFlushIntervalMs",{"type":48,"value":2921}," or ",{"type":42,"tag":57,"props":2923,"children":2925},{"className":2924},[],[2926],{"type":48,"value":2927},"WORKFLOW_STREAM_FLUSH_INTERVAL_MS",{"type":48,"value":337},{"type":42,"tag":106,"props":2930,"children":2931},{},[2932,2937],{"type":42,"tag":110,"props":2933,"children":2934},{},[2935],{"type":48,"value":2936},"Generated step, workflow and webhook bundles are ESM",{"type":48,"value":2938}," (the VM-executed workflow bundle stays CJS). Only matters for a host that post-processes build output.",{"type":42,"tag":106,"props":2940,"children":2941},{},[2942,2947],{"type":42,"tag":110,"props":2943,"children":2944},{},[2945],{"type":48,"value":2946},"Duplicate step or workflow IDs now fail the build.",{"type":48,"value":2948}," In 4.x, two identically named non-exported functions across workspace files collided last-write-wins. If the build fails on this, rename one of them — do not suppress the check.",{"type":42,"tag":106,"props":2950,"children":2951},{},[2952,2963,2965,2971,2973,2979,2981,2987],{"type":42,"tag":110,"props":2953,"children":2954},{},[2955,2961],{"type":42,"tag":57,"props":2956,"children":2958},{"className":2957},[],[2959],{"type":48,"value":2960},"world-postgres",{"type":48,"value":2962}," rows written before the upgrade.",{"type":48,"value":2964}," Failed runs stored by 4.x read back with ",{"type":42,"tag":57,"props":2966,"children":2968},{"className":2967},[],[2969],{"type":48,"value":2970},"error: undefined",{"type":48,"value":2972},", because the payload lives in the legacy ",{"type":42,"tag":57,"props":2974,"children":2976},{"className":2975},[],[2977],{"type":48,"value":2978},"error",{"type":48,"value":2980}," text column rather than ",{"type":42,"tag":57,"props":2982,"children":2984},{"className":2983},[],[2985],{"type":48,"value":2986},"errorJson",{"type":48,"value":2988},". There is no data migration; recent-history dashboards may show blank errors for pre-upgrade failures.",{"type":42,"tag":106,"props":2990,"children":2991},{},[2992,3003,3005,3011],{"type":42,"tag":110,"props":2993,"children":2994},{},[2995,3001],{"type":42,"tag":57,"props":2996,"children":2998},{"className":2997},[],[2999],{"type":48,"value":3000},"world-local",{"type":48,"value":3002}," stream chunks moved",{"type":48,"value":3004}," to ",{"type":42,"tag":57,"props":3006,"children":3008},{"className":3007},[],[3009],{"type":48,"value":3010},"streams\u002Fchunks\u002F\u003CstreamName>\u002F",{"type":48,"value":3012},". Files in the old flat layout are not read back and stale files are left in place — local development state, so deleting the data directory is fine.",{"type":42,"tag":106,"props":3014,"children":3015},{},[3016,3021,3022,3028,3029,3035,3036,3042,3044,3050,3052,3058,3060,3065],{"type":42,"tag":110,"props":3017,"children":3018},{},[3019],{"type":48,"value":3020},"The workflow sandbox is stricter about nondeterminism.",{"type":48,"value":391},{"type":42,"tag":57,"props":3023,"children":3025},{"className":3024},[],[3026],{"type":48,"value":3027},"WeakRef",{"type":48,"value":72},{"type":42,"tag":57,"props":3030,"children":3032},{"className":3031},[],[3033],{"type":48,"value":3034},"FinalizationRegistry",{"type":48,"value":72},{"type":42,"tag":57,"props":3037,"children":3039},{"className":3038},[],[3040],{"type":48,"value":3041},"Atomics.waitAsync",{"type":48,"value":3043},", and async ",{"type":42,"tag":57,"props":3045,"children":3047},{"className":3046},[],[3048],{"type":48,"value":3049},"WebAssembly",{"type":48,"value":3051}," compilation are no longer available inside workflow functions, and ",{"type":42,"tag":57,"props":3053,"children":3055},{"className":3054},[],[3056],{"type":48,"value":3057},"crypto.subtle.digest",{"type":48,"value":3059}," computes synchronously (same results, deterministic timing). Grep ",{"type":42,"tag":57,"props":3061,"children":3063},{"className":3062},[],[3064],{"type":48,"value":62},{"type":48,"value":3066}," files for these APIs; the fix is moving that code into a step, which is a design change — flag it, do not restructure unprompted.",{"type":42,"tag":106,"props":3068,"children":3069},{},[3070,3075],{"type":42,"tag":110,"props":3071,"children":3072},{},[3073],{"type":48,"value":3074},"In-flight runs do not migrate.",{"type":48,"value":3076}," Runs created on a 4.x deployment keep executing on that deployment. Let them finish where they started; do not add code to \"drain\" or re-target them.",{"type":42,"tag":182,"props":3078,"children":3080},{"id":3079},"step-4-custom-world-implementations",[3081,3083,3088],{"type":48,"value":3082},"Step 4 — custom ",{"type":42,"tag":57,"props":3084,"children":3086},{"className":3085},[],[3087],{"type":48,"value":145},{"type":48,"value":3089}," implementations",{"type":42,"tag":51,"props":3091,"children":3092},{},[3093,3095,3100,3102,3115,3116,3122],{"type":48,"value":3094},"Only if the app implements ",{"type":42,"tag":57,"props":3096,"children":3098},{"className":3097},[],[3099],{"type":48,"value":145},{"type":48,"value":3101}," itself. ",{"type":42,"tag":110,"props":3103,"children":3104},{},[3105,3107,3113],{"type":48,"value":3106},"Use the ",{"type":42,"tag":57,"props":3108,"children":3110},{"className":3109},[],[3111],{"type":48,"value":3112},"migrating-world-v4-to-v5",{"type":48,"value":3114}," skill for this part",{"type":48,"value":116},{"type":42,"tag":57,"props":3117,"children":3119},{"className":3118},[],[3120],{"type":48,"value":3121},"npx skills add https:\u002F\u002Fgithub.com\u002Fvercel\u002Fworkflow --skill migrating-world-v4-to-v5",{"type":48,"value":3123},"); it carries the full World migration, including the event ID allocation work summarized below. What follows is enough to scope the job and to know when it has not been done.",{"type":42,"tag":51,"props":3125,"children":3126},{},[3127],{"type":48,"value":3128},"Beyond the stream and step signatures above, the interface gained:",{"type":42,"tag":2741,"props":3130,"children":3131},{},[3132,3143,3154,3166,3179,3184],{"type":42,"tag":106,"props":3133,"children":3134},{},[3135,3141],{"type":42,"tag":57,"props":3136,"children":3138},{"className":3137},[],[3139],{"type":48,"value":3140},"streams",{"type":48,"value":3142}," as a namespace (see the table in step 2).",{"type":42,"tag":106,"props":3144,"children":3145},{},[3146,3152],{"type":42,"tag":57,"props":3147,"children":3149},{"className":3148},[],[3150],{"type":48,"value":3151},"analytics",{"type":48,"value":3153}," — metadata-only listings for runs, steps, events, hooks, waits, and attributes.",{"type":42,"tag":106,"props":3155,"children":3156},{},[3157,3159,3165],{"type":48,"value":3158},"attribute support on runs, including ",{"type":42,"tag":57,"props":3160,"children":3162},{"className":3161},[],[3163],{"type":48,"value":3164},"experimentalSetAttributes",{"type":48,"value":337},{"type":42,"tag":106,"props":3167,"children":3168},{},[3169,3171,3177],{"type":48,"value":3170},"capability advertisement, so the runtime can gate optimizations. Unadvertised capabilities fail closed, which means an incomplete World stays correct but slower — advertise a capability only once it is genuinely implemented. Event ID allocation is not among them: it is a requirement, not a capability. A World that rejected stale writes behind the old ",{"type":42,"tag":57,"props":3172,"children":3174},{"className":3173},[],[3175],{"type":48,"value":3176},"preconditionGuard",{"type":48,"value":3178}," flag can delete that code, since the flag is gone and nothing replaced it.",{"type":42,"tag":106,"props":3180,"children":3181},{},[3182],{"type":48,"value":3183},"an optional per-run event ceiling returned on run reads, which the runtime enforces.",{"type":42,"tag":106,"props":3185,"children":3186},{},[3187,3189,3195,3197,3203],{"type":48,"value":3188},"optional ",{"type":42,"tag":57,"props":3190,"children":3192},{"className":3191},[],[3193],{"type":48,"value":3194},"createRunId()",{"type":48,"value":3196}," and a ",{"type":42,"tag":57,"props":3198,"children":3200},{"className":3199},[],[3201],{"type":48,"value":3202},"region",{"type":48,"value":3204}," on queue options, for worlds that place run state regionally.",{"type":42,"tag":51,"props":3206,"children":3207},{},[3208],{"type":48,"value":3209},"Four contract changes affect existing implementations. The first is required and is not visible from the type signatures:",{"type":42,"tag":2741,"props":3211,"children":3212},{},[3213,3314,3340,3382],{"type":42,"tag":106,"props":3214,"children":3215},{},[3216,3221,3223,3229,3231,3237,3238,3244,3246,3252,3254,3260,3262,3268,3270,3276,3278,3284,3285,3289,3291,3296,3298,3304,3306,3312],{"type":42,"tag":110,"props":3217,"children":3218},{},[3219],{"type":48,"value":3220},"Event IDs are slots, and allocating them is mandatory.",{"type":48,"value":3222}," An event ID is no longer a ULID the World mints freely: it is ",{"type":42,"tag":57,"props":3224,"children":3226},{"className":3225},[],[3227],{"type":48,"value":3228},"evnt_",{"type":48,"value":3230}," followed by the event's 1-based position in that run's log, zero-padded to 26 characters (",{"type":42,"tag":57,"props":3232,"children":3234},{"className":3233},[],[3235],{"type":48,"value":3236},"slotToEventId()",{"type":48,"value":1150},{"type":42,"tag":57,"props":3239,"children":3241},{"className":3240},[],[3242],{"type":48,"value":3243},"@workflow\u002Fworld",{"type":48,"value":3245}," formats one). Positions must be unique and dense with no holes, so the race has to be settled in the store — a unique constraint on ",{"type":42,"tag":57,"props":3247,"children":3249},{"className":3248},[],[3250],{"type":48,"value":3251},"(runId, eventId)",{"type":48,"value":3253}," or a conditional write — rather than by reading the maximum in process and adding one. ",{"type":42,"tag":57,"props":3255,"children":3257},{"className":3256},[],[3258],{"type":48,"value":3259},"events.create()",{"type":48,"value":3261}," params carry ",{"type":42,"tag":57,"props":3263,"children":3265},{"className":3264},[],[3266],{"type":48,"value":3267},"eventCount",{"type":48,"value":3269}," to place the write; when that position is taken the World must not reject the create, it advances to the next free position, commits there, and returns the events occupying the skipped positions on the success response. Take the position ",{"type":42,"tag":3271,"props":3272,"children":3273},"em",{},[3274],{"type":48,"value":3275},"at the commit",{"type":48,"value":3277},", in the same operation that appends the event, since that is what stops an event landing behind a position a reader has already passed. There is no capability to declare and no fallback: the runtime reads a position out of every ID it loads and fails the run when it cannot, so a World whose IDs are not positions type-checks, starts runs, and fails on the first replay with ",{"type":42,"tag":57,"props":3279,"children":3281},{"className":3280},[],[3282],{"type":48,"value":3283},"Event id is not slot-numbered",{"type":48,"value":337},{"type":42,"tag":3286,"props":3287,"children":3288},"br",{},[],{"type":48,"value":3290},"Warn the user that ",{"type":42,"tag":110,"props":3292,"children":3293},{},[3294],{"type":48,"value":3295},"runs already in their store cannot be replayed by the new code",{"type":48,"value":3297}," — a ULID-numbered run is not readable as positions and the runtime refuses it, so those runs must be drained on 4.x first, unless the platform pins a run to its creating deployment (Vercel does, which resolves it). Point them at ",{"type":42,"tag":57,"props":3299,"children":3301},{"className":3300},[],[3302],{"type":48,"value":3303},"@workflow\u002Fworld-testing",{"type":48,"value":3305},"'s ",{"type":42,"tag":57,"props":3307,"children":3309},{"className":3308},[],[3310],{"type":48,"value":3311},"numbers events by position",{"type":48,"value":3313},", which catches a wrong ID scheme in the conformance suite instead of at replay time, and at the \"Upgrading a World to v5\" guide for the full rules.",{"type":42,"tag":106,"props":3315,"children":3316},{},[3317,3322,3324,3330,3332,3338],{"type":42,"tag":110,"props":3318,"children":3319},{},[3320],{"type":48,"value":3321},"Suspension and dispatch.",{"type":48,"value":3323}," The asymmetric ",{"type":42,"tag":57,"props":3325,"children":3327},{"className":3326},[],[3328],{"type":48,"value":3329},"{ timeoutSeconds }",{"type":48,"value":3331}," return contract for waits is gone. Waits are ordinary queue continuations carrying ",{"type":42,"tag":57,"props":3333,"children":3335},{"className":3334},[],[3336],{"type":48,"value":3337},"delaySeconds",{"type":48,"value":3339},", and wait plus step dispatch is unified into one parallel batch per suspension. A World that special-cased the old wait return needs rewriting against the current interface.",{"type":42,"tag":106,"props":3341,"children":3342},{},[3343,3348,3350,3356,3358,3364,3366,3372,3374,3380],{"type":42,"tag":110,"props":3344,"children":3345},{},[3346],{"type":48,"value":3347},"Step queue topics are retired.",{"type":48,"value":3349}," The ",{"type":42,"tag":57,"props":3351,"children":3353},{"className":3352},[],[3354],{"type":48,"value":3355},"'step'",{"type":48,"value":3357}," queue kind no longer exists: queued steps travel on the workflow topic (carrying ",{"type":42,"tag":57,"props":3359,"children":3361},{"className":3360},[],[3362],{"type":48,"value":3363},"stepId",{"type":48,"value":3365},"\u002F",{"type":42,"tag":57,"props":3367,"children":3369},{"className":3368},[],[3370],{"type":48,"value":3371},"stepName",{"type":48,"value":3373}," in the payload) and execute in the combined flow handler. A World that provisioned or routed separate ",{"type":42,"tag":57,"props":3375,"children":3377},{"className":3376},[],[3378],{"type":48,"value":3379},"__wkf_step_*",{"type":48,"value":3381}," topics can drop them.",{"type":42,"tag":106,"props":3383,"children":3384},{},[3385,3390,3392,3397],{"type":42,"tag":110,"props":3386,"children":3387},{},[3388],{"type":48,"value":3389},"World resolution happens at build time.",{"type":48,"value":3391}," Worlds are statically injected into host bundles rather than selected dynamically at runtime, and first-party World packages expose a ",{"type":42,"tag":57,"props":3393,"children":3395},{"className":3394},[],[3396],{"type":48,"value":766},{"type":48,"value":3398}," factory. A custom or community World must be resolvable by the build; verify the app still boots against it rather than assuming a runtime lookup.",{"type":42,"tag":51,"props":3400,"children":3401},{},[3402,3404,3409],{"type":48,"value":3403},"Optional methods may be omitted; the runtime falls back. Point the user at the ",{"type":42,"tag":57,"props":3405,"children":3407},{"className":3406},[],[3408],{"type":48,"value":3112},{"type":48,"value":3410}," skill and the \"Upgrading a World to v5\" guide, which carry the full interface delta and the contract changes above, rather than inventing method bodies.",{"type":42,"tag":182,"props":3412,"children":3414},{"id":3413},"required-output-shape",[3415],{"type":48,"value":3416},"Required output shape",{"type":42,"tag":51,"props":3418,"children":3419},{},[3420],{"type":48,"value":3421},"Return the migration in this structure:",{"type":42,"tag":570,"props":3423,"children":3427},{"className":3424,"code":3425,"language":3426,"meta":575,"style":575},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","## Summary\n## Dependency Changes\n## Code Changes\n## Behavior Changes To Review\n## Verification\n## Open Questions\n","md",[3428],{"type":42,"tag":57,"props":3429,"children":3430},{"__ignoreMap":575},[3431,3444,3456,3468,3480,3492],{"type":42,"tag":581,"props":3432,"children":3433},{"class":583,"line":584},[3434,3439],{"type":42,"tag":581,"props":3435,"children":3436},{"style":588},[3437],{"type":48,"value":3438},"## ",{"type":42,"tag":581,"props":3440,"children":3441},{"style":633},[3442],{"type":48,"value":3443},"Summary\n",{"type":42,"tag":581,"props":3445,"children":3446},{"class":583,"line":594},[3447,3451],{"type":42,"tag":581,"props":3448,"children":3449},{"style":588},[3450],{"type":48,"value":3438},{"type":42,"tag":581,"props":3452,"children":3453},{"style":633},[3454],{"type":48,"value":3455},"Dependency Changes\n",{"type":42,"tag":581,"props":3457,"children":3458},{"class":583,"line":624},[3459,3463],{"type":42,"tag":581,"props":3460,"children":3461},{"style":588},[3462],{"type":48,"value":3438},{"type":42,"tag":581,"props":3464,"children":3465},{"style":633},[3466],{"type":48,"value":3467},"Code Changes\n",{"type":42,"tag":581,"props":3469,"children":3470},{"class":583,"line":665},[3471,3475],{"type":42,"tag":581,"props":3472,"children":3473},{"style":588},[3474],{"type":48,"value":3438},{"type":42,"tag":581,"props":3476,"children":3477},{"style":633},[3478],{"type":48,"value":3479},"Behavior Changes To Review\n",{"type":42,"tag":581,"props":3481,"children":3482},{"class":583,"line":698},[3483,3487],{"type":42,"tag":581,"props":3484,"children":3485},{"style":588},[3486],{"type":48,"value":3438},{"type":42,"tag":581,"props":3488,"children":3489},{"style":633},[3490],{"type":48,"value":3491},"Verification\n",{"type":42,"tag":581,"props":3493,"children":3494},{"class":583,"line":707},[3495,3499],{"type":42,"tag":581,"props":3496,"children":3497},{"style":588},[3498],{"type":48,"value":3438},{"type":42,"tag":581,"props":3500,"children":3501},{"style":633},[3502],{"type":48,"value":3503},"Open Questions\n",{"type":42,"tag":2741,"props":3505,"children":3506},{},[3507,3518,3529],{"type":42,"tag":106,"props":3508,"children":3509},{},[3510,3516],{"type":42,"tag":57,"props":3511,"children":3513},{"className":3512},[],[3514],{"type":48,"value":3515},"## Code Changes",{"type":48,"value":3517}," lists one entry per rule applied, with the file paths touched. Rules that did not apply are listed once as not applicable — do not omit them silently.",{"type":42,"tag":106,"props":3519,"children":3520},{},[3521,3527],{"type":42,"tag":57,"props":3522,"children":3524},{"className":3523},[],[3525],{"type":48,"value":3526},"## Behavior Changes To Review",{"type":48,"value":3528}," carries the step 3 items that apply to this app, each with the concrete follow-up (which dashboard, which env var).",{"type":42,"tag":106,"props":3530,"children":3531},{},[3532,3538],{"type":42,"tag":57,"props":3533,"children":3535},{"className":3534},[],[3536],{"type":48,"value":3537},"## Open Questions",{"type":48,"value":3539}," carries anything that could not be decided from the code, especially a custom World that needs interface work.",{"type":42,"tag":182,"props":3541,"children":3543},{"id":3542},"verification",[3544],{"type":48,"value":3545},"Verification",{"type":42,"tag":51,"props":3547,"children":3548},{},[3549],{"type":48,"value":3550},"Run, in order, and report actual output:",{"type":42,"tag":102,"props":3552,"children":3553},{},[3554,3559,3579,3584],{"type":42,"tag":106,"props":3555,"children":3556},{},[3557],{"type":48,"value":3558},"Install and build. The build must regenerate workflow\u002Fstep bundles without errors.",{"type":42,"tag":106,"props":3560,"children":3561},{},[3562,3564,3569,3571,3577],{"type":48,"value":3563},"Typecheck. The async ",{"type":42,"tag":57,"props":3565,"children":3567},{"className":3566},[],[3568],{"type":48,"value":155},{"type":48,"value":3570}," change and the ",{"type":42,"tag":57,"props":3572,"children":3574},{"className":3573},[],[3575],{"type":48,"value":3576},"steps.get",{"type":48,"value":3578}," signature surface here.",{"type":42,"tag":106,"props":3580,"children":3581},{},[3582],{"type":48,"value":3583},"The app's test suite.",{"type":42,"tag":106,"props":3585,"children":3586},{},[3587],{"type":48,"value":3588},"Start the app and execute one real run end to end, confirming the first step runs and the run reaches a terminal state.",{"type":42,"tag":51,"props":3590,"children":3591},{},[3592],{"type":48,"value":3593},"Fail the migration if any of these are true:",{"type":42,"tag":2741,"props":3595,"children":3598},{"className":3596},[3597],"contains-task-list",[3599,3623,3656,3677,3697,3717,3733,3753,3777,3804,3818,3827,3836,3852],{"type":42,"tag":106,"props":3600,"children":3603},{"className":3601},[3602],"task-list-item",[3604,3609,3610,3615,3616,3621],{"type":42,"tag":3605,"props":3606,"children":3608},"input",{"disabled":827,"type":3607},"checkbox",[],{"type":48,"value":391},{"type":42,"tag":57,"props":3611,"children":3613},{"className":3612},[],[3614],{"type":48,"value":14},{"type":48,"value":539},{"type":42,"tag":57,"props":3617,"children":3619},{"className":3618},[],[3620],{"type":48,"value":226},{"type":48,"value":3622}," versions span both 4.x and 5.x",{"type":42,"tag":106,"props":3624,"children":3626},{"className":3625},[3602],[3627,3630,3631,3636,3637,3642,3643,3648,3650],{"type":42,"tag":3605,"props":3628,"children":3629},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3632,"children":3634},{"className":3633},[],[3635],{"type":48,"value":155},{"type":48,"value":64},{"type":42,"tag":57,"props":3638,"children":3640},{"className":3639},[],[3641],{"type":48,"value":766},{"type":48,"value":64},{"type":42,"tag":57,"props":3644,"children":3646},{"className":3645},[],[3647],{"type":48,"value":882},{"type":48,"value":3649}," is called without ",{"type":42,"tag":57,"props":3651,"children":3653},{"className":3652},[],[3654],{"type":48,"value":3655},"await",{"type":42,"tag":106,"props":3657,"children":3659},{"className":3658},[3602],[3660,3663,3664,3669,3670,3675],{"type":42,"tag":3605,"props":3661,"children":3662},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3665,"children":3667},{"className":3666},[],[3668],{"type":48,"value":314},{"type":48,"value":2921},{"type":42,"tag":57,"props":3671,"children":3673},{"className":3672},[],[3674],{"type":48,"value":321},{"type":48,"value":3676}," is still imported",{"type":42,"tag":106,"props":3678,"children":3680},{"className":3679},[3602],[3681,3684,3685,3690,3691,3696],{"type":42,"tag":3605,"props":3682,"children":3683},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3686,"children":3688},{"className":3687},[],[3689],{"type":48,"value":366},{"type":48,"value":2921},{"type":42,"tag":57,"props":3692,"children":3694},{"className":3693},[],[3695],{"type":48,"value":373},{"type":48,"value":3676},{"type":42,"tag":106,"props":3698,"children":3700},{"className":3699},[3602],[3701,3704,3705,3710,3711,3716],{"type":42,"tag":3605,"props":3702,"children":3703},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3706,"children":3708},{"className":3707},[],[3709],{"type":48,"value":1366},{"type":48,"value":2921},{"type":42,"tag":57,"props":3712,"children":3714},{"className":3713},[],[3715],{"type":48,"value":1373},{"type":48,"value":3676},{"type":42,"tag":106,"props":3718,"children":3720},{"className":3719},[3602],[3721,3724,3726,3731],{"type":42,"tag":3605,"props":3722,"children":3723},{"disabled":827,"type":3607},[],{"type":48,"value":3725}," a ",{"type":42,"tag":57,"props":3727,"children":3729},{"className":3728},[],[3730],{"type":48,"value":1391},{"type":48,"value":3732}," call kept the v4 argument order (name before runId)",{"type":42,"tag":106,"props":3734,"children":3736},{"className":3735},[3602],[3737,3740,3741,3746,3748],{"type":42,"tag":3605,"props":3738,"children":3739},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3742,"children":3744},{"className":3743},[],[3745],{"type":48,"value":1580},{"type":48,"value":3747}," was called without a ",{"type":42,"tag":57,"props":3749,"children":3751},{"className":3750},[],[3752],{"type":48,"value":1399},{"type":42,"tag":106,"props":3754,"children":3756},{"className":3755},[3602],[3757,3760,3761,3767,3769,3775],{"type":42,"tag":3605,"props":3758,"children":3759},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3762,"children":3764},{"className":3763},[],[3765],{"type":48,"value":3766},"world.steps.get",{"type":48,"value":3768}," was called with ",{"type":42,"tag":57,"props":3770,"children":3772},{"className":3771},[],[3773],{"type":48,"value":3774},"undefined",{"type":48,"value":3776}," as its first argument",{"type":42,"tag":106,"props":3778,"children":3780},{"className":3779},[3602],[3781,3784,3785,3790,3792,3797,3799],{"type":42,"tag":3605,"props":3782,"children":3783},{"disabled":827,"type":3607},[],{"type":48,"value":391},{"type":42,"tag":57,"props":3786,"children":3788},{"className":3787},[],[3789],{"type":48,"value":2578},{"type":48,"value":3791}," is imported from ",{"type":42,"tag":57,"props":3793,"children":3795},{"className":3794},[],[3796],{"type":48,"value":173},{"type":48,"value":3798}," instead of ",{"type":42,"tag":57,"props":3800,"children":3802},{"className":3801},[],[3803],{"type":48,"value":2687},{"type":42,"tag":106,"props":3805,"children":3807},{"className":3806},[3602],[3808,3811,3813],{"type":42,"tag":3605,"props":3809,"children":3810},{"disabled":827,"type":3607},[],{"type":48,"value":3812}," a compiler call still passes ",{"type":42,"tag":57,"props":3814,"children":3816},{"className":3815},[],[3817],{"type":48,"value":479},{"type":42,"tag":106,"props":3819,"children":3821},{"className":3820},[3602],[3822,3825],{"type":42,"tag":3605,"props":3823,"children":3824},{"disabled":827,"type":3607},[],{"type":48,"value":3826}," a behavior change from step 3 was silently \"fixed\" instead of reported",{"type":42,"tag":106,"props":3828,"children":3830},{"className":3829},[3602],[3831,3834],{"type":42,"tag":3605,"props":3832,"children":3833},{"disabled":827,"type":3607},[],{"type":48,"value":3835}," workflow or step bodies were restructured beyond the rules above",{"type":42,"tag":106,"props":3837,"children":3839},{"className":3838},[3602],[3840,3843,3845,3850],{"type":42,"tag":3605,"props":3841,"children":3842},{"disabled":827,"type":3607},[],{"type":48,"value":3844}," generated output under ",{"type":42,"tag":57,"props":3846,"children":3848},{"className":3847},[],[3849],{"type":48,"value":724},{"type":48,"value":3851}," was hand-edited",{"type":42,"tag":106,"props":3853,"children":3855},{"className":3854},[3602],[3856,3859],{"type":42,"tag":3605,"props":3857,"children":3858},{"disabled":827,"type":3607},[],{"type":48,"value":3860}," the build, typecheck, or test results were not actually run and reported",{"type":42,"tag":182,"props":3862,"children":3864},{"id":3863},"reference",[3865],{"type":48,"value":3866},"Reference",{"type":42,"tag":2741,"props":3868,"children":3869},{},[3870,3883,3894,3905,3916],{"type":42,"tag":106,"props":3871,"children":3872},{},[3873,3875],{"type":48,"value":3874},"What's new in v5: ",{"type":42,"tag":3876,"props":3877,"children":3881},"a",{"href":3878,"rel":3879},"https:\u002F\u002Fworkflow.dev\u002Fdocs\u002Fwhats-new",[3880],"nofollow",[3882],{"type":48,"value":3878},{"type":42,"tag":106,"props":3884,"children":3885},{},[3886,3888],{"type":48,"value":3887},"Configuration and runtime tuning: ",{"type":42,"tag":3876,"props":3889,"children":3892},{"href":3890,"rel":3891},"https:\u002F\u002Fworkflow.dev\u002Fdocs\u002Fconfiguration",[3880],[3893],{"type":48,"value":3890},{"type":42,"tag":106,"props":3895,"children":3896},{},[3897,3899],{"type":48,"value":3898},"Upgrading a World to v5: ",{"type":42,"tag":3876,"props":3900,"children":3903},{"href":3901,"rel":3902},"https:\u002F\u002Fworkflow.dev\u002Fworlds\u002Fupgrading-to-v5",[3880],[3904],{"type":48,"value":3901},{"type":42,"tag":106,"props":3906,"children":3907},{},[3908,3910],{"type":48,"value":3909},"Building a World: ",{"type":42,"tag":3876,"props":3911,"children":3914},{"href":3912,"rel":3913},"https:\u002F\u002Fworkflow.dev\u002Fworlds\u002Fbuilding-a-world",[3880],[3915],{"type":48,"value":3912},{"type":42,"tag":106,"props":3917,"children":3918},{},[3919,3921],{"type":48,"value":3920},"v4 documentation: ",{"type":42,"tag":3876,"props":3922,"children":3925},{"href":3923,"rel":3924},"https:\u002F\u002Fworkflow.dev\u002Fv4\u002Fdocs",[3880],[3926],{"type":48,"value":3923},{"type":42,"tag":3928,"props":3929,"children":3930},"style",{},[3931],{"type":48,"value":3932},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":3934,"total":707},[3935,3950,3962,3968,3976,3990],{"slug":3936,"name":3936,"fn":3937,"description":3938,"org":3939,"tags":3940,"stars":22,"repoUrl":23,"updatedAt":3949},"internal-dev-workbench","set up isolated development workbenches","Spin up a portless + tmux dev session for the Workflow SDK that gives each git worktree isolated `\u003Cbranch>.\u003Cname>.localhost` URLs for the Next.js workbench and the observability UI, plus a Claude statusline that surfaces those URLs. Use only when the user asks for a \"portless dev session\", a \"tmux dev layout for workflow\", \"worktree-isolated dev URLs\", or wants to wire workflow dev URLs into the Claude statusline. Do not activate for the generic \"start the dev server\" \u002F \"run pnpm dev\" task.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3941,3942,3945,3948],{"name":20,"slug":21,"type":15},{"name":3943,"slug":3944,"type":15},"Local Development","local-development",{"name":3946,"slug":3947,"type":15},"Observability","observability",{"name":9,"slug":8,"type":15},"2026-08-22T03:26:08.945287",{"slug":3951,"name":3951,"fn":3952,"description":3953,"org":3954,"tags":3955,"stars":22,"repoUrl":23,"updatedAt":3961},"migrating-to-workflow-sdk","migrate workflows to Vercel Workflow SDK","Migrates Temporal, Inngest, Trigger.dev, and AWS Step Functions workflows to the Workflow SDK. Use when porting Activities, Workers, Signals, step.run(), step.waitForEvent(), Trigger.dev tasks \u002F wait.forToken \u002F triggerAndWait, ASL JSON state machines, Task\u002FChoice\u002FWait\u002FParallel states, task tokens, or child workflows.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3956,3957,3958],{"name":17,"slug":18,"type":15},{"name":9,"slug":8,"type":15},{"name":3959,"slug":3960,"type":15},"Workflow Automation","workflow-automation","2026-08-22T03:26:07.955862",{"slug":4,"name":4,"fn":5,"description":6,"org":3963,"tags":3964,"stars":22,"repoUrl":23,"updatedAt":24},{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3965,3966,3967],{"name":20,"slug":21,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},{"slug":3112,"name":3112,"fn":3969,"description":3970,"org":3971,"tags":3972,"stars":22,"repoUrl":23,"updatedAt":3975},"upgrade Workflow SDK World to v5","Upgrades a custom Workflow SDK World implementation from the v4 spec to v5. Use when a package implements the `World` interface from `@workflow\u002Fworld` and is moving to 5.x — event IDs that are ULIDs rather than slot positions, `Event id is not slot-numbered` at replay time, a `specVersion` the runtime refuses, `writeToStream` \u002F `closeStream` \u002F `readFromStream` as top-level World methods, `steps.get` or `events.listByCorrelationId` without a `runId`, a `'step'` queue kind or `__wkf_step_*` topics, a `preconditionGuard` capability, or a `createLocalWorld` \u002F `createVercelWorld` factory.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3973,3974],{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},"2026-08-22T03:57:58.572694",{"slug":14,"name":14,"fn":3977,"description":3978,"org":3979,"tags":3980,"stars":22,"repoUrl":23,"updatedAt":3989},"build durable workflows with Vercel","Creates durable, resumable workflows using Vercel's Workflow SDK. Use when building workflows that need to survive restarts, pause for external events, retry on failure, or coordinate multi-step operations over time. Triggers on mentions of \"workflow\", \"durable functions\", \"resumable\", \"workflow sdk\", \"queue\", \"event\", \"push\", \"subscribe\", or step-based orchestration.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3981,3984,3987,3988],{"name":3982,"slug":3983,"type":15},"Backend","backend",{"name":3985,"slug":3986,"type":15},"SDK","sdk",{"name":9,"slug":8,"type":15},{"name":3959,"slug":3960,"type":15},"2026-08-22T03:26:07.009824",{"slug":3991,"name":3991,"fn":3992,"description":3993,"org":3994,"tags":3995,"stars":22,"repoUrl":23,"updatedAt":4002},"workflow-init","initialize Vercel Workflow SDK","Install and configure Vercel Workflow SDK before it exists in node_modules. Use when the user asks to \"install workflow\", \"set up workflow\", \"add durable workflows\", \"configure workflow sdk\", or \"init workflow\" for Next.js, Express, Hono, Fastify, NestJS, Nitro, Nuxt, Astro, SvelteKit, or Vite.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[3996,3999,4000,4001],{"name":3997,"slug":3998,"type":15},"Node.js","node-js",{"name":3985,"slug":3986,"type":15},{"name":9,"slug":8,"type":15},{"name":3959,"slug":3960,"type":15},"2026-08-22T03:26:09.958394",{"items":4004,"total":4175},[4005,4025,4039,4056,4067,4082,4098,4114,4126,4143,4155,4165],{"slug":4006,"name":4006,"fn":4007,"description":4008,"org":4009,"tags":4010,"stars":4022,"repoUrl":4023,"updatedAt":4024},"next-cache-components-adoption","enable and migrate to Next.js Cache Components","Turn on Cache Components in a Next.js app and resolve the blocking routes it surfaces. Use when the user wants to enable, adopt, or migrate to Cache Components, flip the `cacheComponents` flag, work through a flood of blocking-prerender \u002F instant validation errors, run the `cache-components-instant-false` codemod, or decide between opting routes out with `export const instant = false` and fixing them in place.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4011,4014,4017,4018,4021],{"name":4012,"slug":4013,"type":15},"Caching","caching",{"name":4015,"slug":4016,"type":15},"Frontend","frontend",{"name":17,"slug":18,"type":15},{"name":4019,"slug":4020,"type":15},"Next.js","next-js",{"name":9,"slug":8,"type":15},141208,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fnext.js","2026-08-22T03:25:50.984703",{"slug":4026,"name":4026,"fn":4027,"description":4028,"org":4029,"tags":4030,"stars":4022,"repoUrl":4023,"updatedAt":4038},"next-cache-components-optimizer","optimize Next.js cache components","Drive a Next.js route to instant navigation by setting up an agentic loop, under Cache Components \u002F PPR, on initial load (hard navigation) and client-side navigation (soft navigation). Encode the goal as a failing @next\u002Fplaywright instant() e2e and work it to green, one verified route at a time; the shipped test then guards against regression. Use when asked to make a route's navigation instant (its static shell commits immediately), fix a route whose static shell isn't prerendered\u002Fserved\u002Fprefetched, grow a route's static shell or fix its slow first paint, diagnose which Suspense boundary keeps a route out of its static shell, or write the instant() e2e guard for one. Requires Next.js 16.3+ with cacheComponents; directs an upgrade if older.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4031,4032,4033,4034,4037],{"name":4012,"slug":4013,"type":15},{"name":4015,"slug":4016,"type":15},{"name":4019,"slug":4020,"type":15},{"name":4035,"slug":4036,"type":15},"Performance","performance",{"name":9,"slug":8,"type":15},"2026-08-12T04:28:44.716229",{"slug":4040,"name":4040,"fn":4041,"description":4042,"org":4043,"tags":4044,"stars":4022,"repoUrl":4023,"updatedAt":4055},"next-dev-loop","verify Next.js runtime behavior","Verify Next.js runtime behavior after editing app code. Use this skill to confirm a change actually works in a running app — not just that it compiles or type-checks. Combines \u002F_next\u002Fmcp (Next.js's view) with agent-browser (the browser's view). Requires a running `next dev`.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4045,4048,4049,4050,4051,4052],{"name":4046,"slug":4047,"type":15},"Debugging","debugging",{"name":4015,"slug":4016,"type":15},{"name":3943,"slug":3944,"type":15},{"name":4019,"slug":4020,"type":15},{"name":9,"slug":8,"type":15},{"name":4053,"slug":4054,"type":15},"Web Development","web-development","2026-08-22T03:25:48.935638",{"slug":4057,"name":4057,"fn":4058,"description":4059,"org":4060,"tags":4061,"stars":4022,"repoUrl":4023,"updatedAt":4066},"next-partial-prefetching-adoption","adopt Partial Prefetching in Next.js apps","Turn on Partial Prefetching in a Next.js app and work through the insights it surfaces. Use when the user wants to enable or adopt Partial Prefetching, flip the `partialPrefetching` flag, opt routes in with `export const prefetch = 'partial'`, audit `Link prefetch={true}` behavior, preserve existing prefetched UI with `instant()` tests, or resolve the instant-link-prefetch-partial and instant-shell-url-data insights.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4062,4063,4064,4065],{"name":4015,"slug":4016,"type":15},{"name":4019,"slug":4020,"type":15},{"name":4035,"slug":4036,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:42:31.551122",{"slug":4068,"name":4068,"fn":4069,"description":4070,"org":4071,"tags":4072,"stars":4079,"repoUrl":4080,"updatedAt":4081},"turborepo","manage monorepos with Turborepo","Turborepo monorepo build system guidance. Triggers on: turbo.json, task pipelines,\ndependsOn, caching, remote cache, the \"turbo\" CLI, --filter, --affected, CI optimization, environment\nvariables, internal packages, monorepo structure\u002Fbest practices, and boundaries.\n\nUse when user: configures tasks\u002Fworkflows\u002Fpipelines, creates packages, sets up\nmonorepo, shares code between apps, runs changed\u002Faffected packages, debugs cache,\nor has apps\u002Fpackages directories.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4073,4076,4077],{"name":4074,"slug":4075,"type":15},"CI\u002FCD","ci-cd",{"name":4035,"slug":4036,"type":15},{"name":4078,"slug":4068,"type":15},"Turborepo",30809,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fturborepo","2026-08-28T14:42:49.536963",{"slug":4083,"name":4083,"fn":4084,"description":4085,"org":4086,"tags":4087,"stars":4095,"repoUrl":4096,"updatedAt":4097},"add-function-examples","add AI function examples for testing","Guide for adding new AI function examples, for testing specific features against the actual provider APIs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4088,4091,4094],{"name":4089,"slug":4090,"type":15},"AI SDK","ai-sdk",{"name":4092,"slug":4093,"type":15},"Testing","testing",{"name":9,"slug":8,"type":15},25670,"https:\u002F\u002Fgithub.com\u002Fvercel\u002Fai","2026-04-06T18:55:51.318866",{"slug":4099,"name":4099,"fn":4100,"description":4101,"org":4102,"tags":4103,"stars":4095,"repoUrl":4096,"updatedAt":4113},"add-harness-package","add AI SDK harness packages","Guide for adding new AI SDK harness packages. Use when creating a new @ai-sdk\u002Fharness-\u003Cname> package that adapts a coding-agent runtime to HarnessV1.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4104,4107,4108,4111,4112],{"name":4105,"slug":4106,"type":15},"Agents","agents",{"name":4089,"slug":4090,"type":15},{"name":4109,"slug":4110,"type":15},"Harness","harness",{"name":3985,"slug":3986,"type":15},{"name":9,"slug":8,"type":15},"2026-06-18T08:29:19.858737",{"slug":4115,"name":4115,"fn":4116,"description":4117,"org":4118,"tags":4119,"stars":4095,"repoUrl":4096,"updatedAt":4125},"add-provider-package","add new provider packages to AI SDK","Guide for adding first-party AI provider packages to the AI SDK. Use when creating a provider package under packages\u002F to integrate an external AI service.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4120,4121,4124],{"name":4089,"slug":4090,"type":15},{"name":4122,"slug":4123,"type":15},"API Development","api-development",{"name":9,"slug":8,"type":15},"2026-08-28T14:42:29.283821",{"slug":4127,"name":4127,"fn":4128,"description":4129,"org":4130,"tags":4131,"stars":4095,"repoUrl":4096,"updatedAt":4142},"adr-skill","create and maintain architecture decision records","Create and maintain Architecture Decision Records (ADRs) optimized for agentic coding workflows. Use when you need to propose, write, update, accept\u002Freject, deprecate, or supersede an ADR; bootstrap an adr folder and index; consult existing ADRs before implementing changes; or enforce ADR conventions. This skill uses Socratic questioning to capture intent before drafting, and validates output against an agent-readiness checklist.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4132,4135,4138,4141],{"name":4133,"slug":4134,"type":15},"ADR","adr",{"name":4136,"slug":4137,"type":15},"Architecture","architecture",{"name":4139,"slug":4140,"type":15},"Documentation","documentation",{"name":20,"slug":21,"type":15},"2026-04-06T18:55:50.043694",{"slug":4090,"name":4090,"fn":4144,"description":4145,"org":4146,"tags":4147,"stars":4095,"repoUrl":4096,"updatedAt":4154},"build AI features with Vercel AI SDK","Answer questions about the AI SDK and help build AI-powered features. Use when developers: (1) Ask about AI SDK functions like generateText, streamText, ToolLoopAgent, embed, or tools, (2) Want to build AI agents, chatbots, RAG systems, or text generation features, (3) Have questions about AI providers (OpenAI, Anthropic, Google, etc.), streaming, tool calling, structured output, or embeddings, (4) Use React hooks like useChat or useCompletion. Triggers on: \"AI SDK\", \"Vercel AI SDK\", \"generateText\", \"streamText\", \"add AI to my app\", \"build an agent\", \"tool calling\", \"structured output\", \"useChat\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4148,4149,4150,4153],{"name":4105,"slug":4106,"type":15},{"name":4089,"slug":4090,"type":15},{"name":4151,"slug":4152,"type":15},"LLM","llm",{"name":9,"slug":8,"type":15},"2026-04-06T18:55:48.739463",{"slug":4156,"name":4156,"fn":4157,"description":4158,"org":4159,"tags":4160,"stars":4095,"repoUrl":4096,"updatedAt":4164},"capture-api-response-test-fixture","capture API response test fixtures","Capture API response test fixture.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4161,4162,4163],{"name":4122,"slug":4123,"type":15},{"name":4092,"slug":4093,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:42:27.308031",{"slug":4166,"name":4166,"fn":4167,"description":4168,"org":4169,"tags":4170,"stars":4095,"repoUrl":4096,"updatedAt":4174},"develop-ai-functions-example","develop AI SDK function examples","Develop examples for AI SDK functions. Use when creating, running, or modifying examples under examples\u002Fai-functions\u002Fsrc to validate provider support, demonstrate features, or create test fixtures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4171,4172,4173],{"name":4089,"slug":4090,"type":15},{"name":4092,"slug":4093,"type":15},{"name":9,"slug":8,"type":15},"2026-08-28T14:42:28.252942",74]