# XState 6.0.0-alpha.45 - Product: XState (https://whatsnew.fyi/product/xstate) - Vendor: Stately - Date: 2026-08-22 - Version: 6.0.0-alpha.45 - Original notes: https://github.com/statelyai/xstate/releases/tag/xstate%406.0.0-alpha.45 - Permalink: https://whatsnew.fyi/product/xstate/releases/6.0.0-alpha.45 - Labels: Pre-release What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. Reuse: the summaries, labels and curation here are © What's New. Quote freely with attribution and a link back; wholesale republication of the corpus is not permitted — terms: https://whatsnew.fyi/terms. The vendors' own release notes remain their publishers'. --- - **changed** — The drive loop no longer routes root events by hand; executeEffects retains root-addressed events and execution.waitForEvent() hands them out before deferring to the adapter - **changed** — executeEffects now resolves with void - **added** — createDurable(logic, adapter, { inspect }) observes the execution's inspection events across the whole live actor tree, including transitions computed by the pure path - **added** — execution.getActorRef(snapshot, address) resolves a logical address against the snapshot's live actor tree - **changed** — Machine output types now infer from the config's output function when no schemas.output schema is declared - **changed** — DurableSnapshot keeps the status/output/error discriminant visible when TLogic is an unresolved type parameter - **changed** — Adapter waitForEvent implementations may return plain event objects without requiring generic host library casts ###### Patch Changes - e0dc812: Durable execution DX improvements: - The drive loop no longer routes root events by hand. `executeEffects` retains the root-addressed events it captures, and `execution.waitForEvent()` hands them out before deferring to the adapter, so the canonical loop is: ```ts let [state, effects] = execution.initialTransition(input); await execution.executeEffects(effects); while (state.status === 'active') { [state, effects] = execution.transition(state, await execution.waitForEvent()); await execution.executeEffects(effects); } ``` (`executeEffects` now resolves with `void`.) - `createDurable(logic, adapter, { inspect })` observes the execution's inspection events (`@xstate.actor` / `@xstate.transition`) across the whole live actor tree, including transitions computed by the pure path — the host-side home for operation logs and instrumentation. - `execution.getActorRef(snapshot, address)` resolves a logical address against the snapshot's live actor tree, for hosts whose durable mailbox stores addresses as strings. - Machine `output` types infer from the config's `output` function when no `schemas.output` schema is declared; a declared schema stays authoritative. - `DurableSnapshot` keeps the `status`/`output`/`error` discriminant visible when `TLogic` is an unresolved type parameter, and adapter `waitForEvent` implementations may return plain event objects — generic host libraries no longer need casts. - e0dc812: A machine's output type is now inferred from its `output` config when no `schemas.output` is declared. A declared `schemas.output` stays authoritative. ```ts const machine = setup({}).createMachine({ context: { shipped: ['sku-1'] }, initial: 'done', states: { done: { type: 'final' } }, output: ({ context }) => ({ status: 'shipped' as const, skus: context.shipped }) }); // OutputFrom is now // { status: 'shipped'; skus: string[] } instead of {} ```