# XState 6.0.0-alpha.50 - Product: XState (https://whatsnew.fyi/product/xstate) - Vendor: Stately - Date: 2026-08-27 - Version: 6.0.0-alpha.50 - Original notes: https://github.com/statelyai/xstate/releases/tag/xstate%406.0.0-alpha.50 - Permalink: https://whatsnew.fyi/product/xstate/releases/6.0.0-alpha.50 - 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** — Invalid external events are now rejected at the delivery boundary instead of erroring the actor or throwing, covering events whose payload fails a declared runtime validator schema and internal event types sent from outside their owning actor - **added** — Add onRejectedEvent dead-letter hook on createActor() options to receive an EventRejection describing the event, target, source, origin, reason and validation issues - **changed** — The @xstate.deadletter inspection event now carries validation issues and underlying error for boundary rejections - **changed** — Pure transition() calls no longer throw for invalid external events; the snapshot is returned unchanged with a @xstate.deadLetter effect carrying the rejection - **changed** — The @xstate.deadLetter effect executes through the deadLetter runtime operation so createDurable() adapters can journal rejections by implementing deadLetter ###### Patch Changes - 7f9fc4f: Invalid external events are now rejected at the delivery boundary instead of erroring the actor or throwing. This covers events whose payload fails a declared runtime validator schema and internal event types (`internalEvents`) sent from outside their owning actor. A rejected event is never delivered: the actor does not transition, does not error, and no API throws. Rejections are reported through: - a new `onRejectedEvent` dead-letter hook on `createActor(...)` options, which receives an `EventRejection` describing the event, target, source, origin, reason and validation issues; - the `@xstate.deadletter` inspection event, which now also carries the validation `issues` and underlying `error` for boundary rejections; - a development-mode console warning. ```ts const actor = createActor(machine, { onRejectedEvent: (rejection) => { console.log(rejection.event, rejection.reason, rejection.issues); } }); ``` Pure `transition(...)` calls no longer throw for invalid external events: the snapshot is returned unchanged with a `@xstate.deadLetter` effect carrying the rejection, so durable hosts can journal rejections and replay stays total even with poisoned queued events. The effect executes through the `deadLetter` runtime operation, so `createDurable(...)` adapters journal rejections by implementing `deadLetter` like any other runtime operation. Internal faults are unchanged: values the machine produces itself (input, context, output, emitted events and delayed raised events) that fail their schema still error the actor, and pure transitions still throw for them.