📄️ Message Streams
Message streams are the v2 authoring surface for repeated workflow messages:
📄️ Signals
Send typed external commands into running workflows and understand signal validation, routing, and waits.
📄️ Updates
Updates allow you to retrieve information about the current state of a workflow and mutate the workflow state at the same time. They are essentially both a query and a signal combined into one.
📄️ Queries
Queries allow you to retrieve information about the current state of a workflow without affecting its execution. This is useful for monitoring and debugging purposes.
📄️ Signal + Timer
Workflow\V2 supports both await($condition, timeout $key) for timeout-backed condition waits and await('signal-name', timeout: $seconds) for timeout-backed named signal waits.
📄️ Timers
Use durable timers and deterministic workflow time without depending on wall-clock process state.
📄️ Condition Waits
await($condition, $conditionKey = null) provides replay-safe condition waits. Use it when the predicate depends only on workflow state that was already derived from durable inputs such as updates, activity results, or child results. If you want one named external signal value directly, call await('name') — see Signals.
📄️ Timeouts
Workflow-level timeouts let you bound how long a workflow is allowed to run. There are two timeout scopes:
📄️ Continue As New
The Continue As New pattern allows a running workflow to restart itself with new arguments.
📄️ Side Effects
A side effect is a closure containing non-deterministic code. The closure is only executed once and the result is saved. It will not execute again if the workflow is retried. Instead, it will return the saved result. This makes the workflow deterministic because replaying the workflow will always return the same stored value rather than re-running the non-deterministic code.
📄️ Concurrency
Parallel barriers suspend as one durable workflow step through all([...]). Build them with closures such as fn () => activity(...) and fn () => child(...) so the runtime can see the full barrier tree before the workflow suspends. Results come back in the original nested array shape.
📄️ Sagas
Sagas are an established design pattern for managing complex, long-running operations:
📄️ Child Workflows
The current Workflow\V2 slice supports durable child workflows through straight-line child() calls and through all([...]) fan-in barriers that can be child-only, mixed with activities, or nested inside larger all([...]) groups. Together, these give a parent workflow a durable way to schedule one or more sub-workflows and wait for their outcomes without keeping the parent process alive.
📄️ Cancel and Terminate
Cancel and terminate are first-class durable commands that close a running workflow. Both are recorded in command history, appear in typed history events, and surface in Waterline.
📄️ Heartbeats
Heartbeats let a long-running activity report that its current attempt is still alive.
📄️ Schedules
Schedules let you start workflow runs on a recurring basis using cron expressions. Each schedule is a named, durable entity that the engine evaluates on every tick to determine whether a new run should be triggered.
📄️ Search Attributes
Search attributes are typed, indexed key-value pairs that a workflow can upsert at any point during execution. Unlike visibility labels (which are set once at start time), search attributes can be updated as the workflow progresses, making them ideal for tracking workflow status, customer identifiers, or any operator-visible metadata that changes over the lifetime of a run.
📄️ Memo
Memos are non-indexed key-value metadata that a workflow can read and update at any point during execution. Unlike search attributes (which are indexed and filterable), memos are designed for richer, structured metadata that appears in detail views and history exports but is excluded from fleet-wide filtering and sorting by contract.
📄️ Events
Lifecycle events are dispatched at key stages of workflow and activity execution to notify your application of progress, completion, or failures. These are standard Laravel events — register listeners in your EventServiceProvider or with Event::listen().
📄️ Versioning
Since workflows can run for long periods, sometimes months or even years, it's common to need to make changes to a workflow definition while executions are still in progress. Without versioning, modifying workflow code that affects the execution path would cause non-determinism errors during replay.
📄️ External Payload Storage
External payload storage offloads large workflow payloads to a pluggable
📄️ Activity Execution Model
How ordinary queued activities, local activities, worker sessions, and sticky execution fit together in Durable Workflow v2.
📄️ Local Activities
Run short activity work inside the current workflow worker process while preserving durable activity history, retries, timeouts, and visibility.
📄️ Worker Sessions
Pin a sequence of durable activity attempts to one worker-session lease for GPU, filesystem, or process-local state affinity.
📄️ Sticky Execution
Use sticky workflow-task routing as a supported v2 replay optimization with cold replay as the correctness fallback.