NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
Packagist · #3673 most downloaded on Packagist
Embedded durable workflow runtime and orchestration engine for Laravel applications.
Last release today
07 Oct 2026
Ships on a steady schedule
a new release about every 8 days
Nearly every release is documented
notes for 57 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
5 years old
536 releases · first in 2022
Correct hourly dashboard throughput outside UTC. Projection timestamps use a UTC elapsed-hour cutoff, while legacy rows use the application's timestam
The worker protocol and public method signatures are unchanged.
Full source qualification passes the database and Laravel matrix, quality checks, regression corpus and coverage gate. The merged source tree is identical to the qualified tree. Focused PostgreSQL dashboard coverage passes 37 cases with 147 assertions, including offset zones, daylight-saving boundaries, legacy timestamps, read-only observation and writer cleanup.
See PR #649 for implementation and published consumer verification.
One column per quarter.
Fix native workflow queries while waiting for multiple child workflows.
Fix native workflow queries while waiting for multiple child workflows.
Query replay now waits for the child's outcome to be committed to the parent history before advancing an all() wait. Completed, failed, cancelled and terminated child rows cannot prematurely resolve the parent's query state.
Regression coverage checks committed outcomes, mixed waits and repeated queries that leave durable history unchanged. Execution and portable SDK contracts are unchanged.
See #645.
Fix offline replay and queries for legacy PHP workflows that take the default version branch when an activity or timer already occupies that history p
Fix offline replay and queries for legacy PHP workflows that take the default version branch when an activity or timer already occupies that history position.
Replay now resolves the version before checking the marker shape, matching live execution. Malformed markers and genuine activity or timer drift remain rejected.
Regression coverage includes pending and completed legacy histories, cold worker replay and repeated queries without changing durable history.
See #643.
PHP schedules can now set workflow execution and run timeouts through the supported ScheduleManager API.
PHP schedules can now set workflow execution and run timeouts through the supported ScheduleManager API.
Pass executionTimeoutSeconds and runTimeoutSeconds to create(), or set the corresponding action fields in createFromSpec(). Manual triggers and automatic starts forward the same budgets. Updating a schedule changes future starts while preserving deadlines for runs already started. Omitted timeouts retain existing behavior, and PHP timeout values follow StartOptions validation.
The schedule guide includes runnable examples and explains execution versus run budgets. No database migration or worker protocol change is required.
Details: #627
Fixes an unnecessary task-to-run database lookup when compatibility resolution receives an explicit run with a null marker. The supplied run remains a
Fixes an unnecessary task-to-run database lookup when compatibility resolution receives an explicit run with a null marker. The supplied run remains authoritative, which also avoids a Laravel lazy-loading violation in that path.
Task-marker precedence and the relationship fallback when no run is supplied are preserved. No schema or worker protocol changes are required.
Thanks to @vanducng for the report, fix and regression tests.
Details: #636
Add bounded reads for operator run views.
Add bounded reads for operator run views.
These optional observer methods preserve custom observer compatibility. Worker
execution and portable protocol behavior are unchanged.
Full merged-source checks pass on baf795cea9bd6f582e001794bd72577f015dd1f2,
including coverage, MySQL, PostgreSQL, MariaDB and Laravel 9–13 upgrades.
A fresh registry install passes all 37 bounded-reader cases / 253 assertions.
The published registry/platform checks and all supported Laravel 9–13 / PHP
upgrade cells pass in release verification.
See #633, #634 and #635. Supporting Waterline and Server delivery continues in
durable-workflow/waterline#141.
Improve bounded operator dashboards.
Improve bounded operator dashboards.
Worker execution and protocol behavior are unchanged. Full source checks pass
on the release commit, including coverage, MySQL, PostgreSQL, MariaDB and the
Laravel 9–13 upgrade matrix.
See #630, #631 and #632. Supporting Server and Waterline delivery continues in
durable-workflow/waterline#141.
Dashboard trends now aggregate completed and failed counts in the database, and median duration selects the middle value without loading every duratio
Dashboard trends now aggregate completed and failed counts in the database,
and median duration selects the middle value without loading every duration.
Adds an opt-in boundedDashboardSummary() observer method that defers complete
history audits. Unevaluated audit counts are null with
history_audit_evaluation: not_requested. Existing dashboard and metrics APIs
retain their full audits.
Qualified on SQLite, MySQL, PostgreSQL and MariaDB, with supported Laravel
upgrade checks and the complete unit and coverage gates passing.
Source checks.
Waterline adoption is in Waterline #142,
with the standalone Server endpoint in Server #305.
Workflow execution and portable worker protocols are unchanged.
Correct configured execution namespaces and queued PHP workflow recovery.
Correct configured execution namespaces and queued PHP workflow recovery.
Workflow\V2\WorkflowStub::make() persists the configured namespace on new
instances, runs and tasks, matching the control-plane start API. PHP schedules
start in their schedule's namespace, including an explicit override.
An existing instance cannot be reassigned to a different namespace by a new
start. Load existing instances in their original namespace. This release does
not migrate older unscoped instances.
Addresses #607, #617 and #620. No portable protocol change or SDK upgrade is
required. Server images need an updated embedded Workflow package.
Preserves worker-session routing in activity history so cold replay can validate the original session identity, requirements and lifetime options. Ord
Preserves worker-session routing in activity history so cold replay can validate the original session identity, requirements and lifetime options. Ordinary activity histories retain their previous field shape.
Upgrade the standalone Server image to consume this fix. Existing stored histories are preserved. The patch does not reconstruct session metadata that earlier releases omitted.
Native 2.4.0 adds whole-run cooperative cancellation with an immutable request context, original deadline and one bounded parent/child/Activity tree.
Native 2.4.0 adds whole-run cooperative cancellation with an immutable request context, original deadline and one bounded parent/child/Activity tree. Workflow code can perform shielded durable cleanup, inspect its remaining budget and resume at the same delivery boundary after worker replacement.
Operation policies distinguish trying cancellation, waiting for cancellation completion and abandoning eligible work. Managed stop receipts fence stale Activity results. The canonical cascade records delivery, stop evidence, cleanup recovery and terminal outcomes.
Scheduler lease repair and cancellation-deadline enforcement now acquire the run before its tasks, matching operator repair and Server mutations. The PHP 8.1 minimum remains supported.
The published stable mixed PHP parent, Python child, Rust remote Activity and PHP local Activity demonstration passes 236 assertions. Both runs finish Cancelled with cleanup completed 15.802418 seconds after the original request, before its unchanged 30-second deadline. It includes physical stop without application heartbeats, actual cleanup-worker SIGKILL, replacement replay, stale result refusal, duplicate identity/deadline and one API/CLI view. The unchanged published Waterline frontend displays the qualified cascade on desktop and mobile.
The demonstration uses published Native 2.4.0 in Server 2.5.0, PHP SDK 2.2.0, Python 2.4.0, Rust 3.0.0 and CLI 2.2.0. Waterline 2.1.0 is also published. Published lifecycle conformance passes all 12 cells. Independently cancellable scopes remain disabled experimental source preview outside the stable release claim. Existing immediate cancellation remains available through its legacy API.
Exact tuples and comparison results are recorded in shared cancellation #136.
Cancellation candidate corrections
The concurrency regression runs actual repair and watchdog passes on MySQL and PostgreSQL. Both databases pass the expired-lease and expired-cancellation-deadline cases. Both MySQL cases fail with the original watchdog implementation.
Complete database, framework upgrade, code quality, unit coverage and regression corpus qualification passes at https://github.com/durable-workflow/workflow/actions/runs/37425470512.
This is a prerelease for the whole-run cooperative cancellation contract. General independently cancellable scopes remain a disabled source preview. Published mixed-language acceptance remains tracked in durable-workflow/.github#136.
feat: strengthen canonical cancellation context and propagation by @rmcdaniel in #603
Full Changelog: 2.3.5...2.4.0-rc.1
Fixes an infinite queue-release loop after a legacy workflow continues as new. Signal and Timer jobs belonging to a continued run now retire instead o
Fixes an infinite queue-release loop after a legacy workflow continues as new.
Signal and Timer jobs belonging to a continued run now retire instead of
following the running successor and repeatedly retrying the old operation.
Jobs for the current running workflow retain their normal retry behavior.
The regression covers two- and three-run chains with pending signals and
timers. Full main CI, database shards, embedded Laravel upgrade checks and
coverage gates pass on the release commit. The portable V2 contract is unchanged.
Install with composer require durable-workflow/workflow:2.3.5.
Repairs now preserve the original run's namespace when recreating workflow, activity and timer tasks. This keeps recovered work discoverable by Server
Repairs now preserve the original run's namespace when recreating workflow,
activity and timer tasks. This keeps recovered work discoverable by Server
workers polling that namespace.
The repair pass also restores a missing namespace on existing tasks when they
are eligible for redispatch, expired lease recovery or replay recovery. Existing
namespace assignments and current leases are preserved. No database migration
or SDK protocol change is required.
Cooperative cleanup deadlines now close runs on the runtime's next repair pass even when no compatible workflow worker is available.
Cooperative cleanup deadlines now close runs on the runtime's next repair pass even when no compatible workflow worker is available.
cancellation_deadlines_enforced in repair-pass JSON.Ordinary Worker protocol remains 1.19. Service-mode cooperative cancellation is still undergoing separate model and SDK qualification.
Details: Workflow #604.
Fix condition waits inside parallel groups and keyed selections after an insufficient signal.
Fix condition waits inside parallel groups and keyed selections after an insufficient signal.
Ordinary Worker protocol remains 1.19. Rust service Workers should use SDK 2.1.3 for replay of grouped condition reopens.
Source qualification includes the full database and Laravel matrix, durable replay corpus, and five actual Worker scenarios with a fresh process per claim. Stable Server publication and exact published consumer follow-through are tracked in issue 601.
Recover an expired workflow task even when an older activity remains legitimately in flight. A replacement worker can claim the workflow task's next a
Recover an expired workflow task even when an older activity remains legitimately in flight. A replacement worker can claim the workflow task's next attempt without waiting for the activity's separate lease. The active activity's ownership, attempt, lease and history are preserved.
Public APIs, database schema and worker protocol defaults are unchanged.
The full source matrix passes supported database, embedded Laravel, quality, corpus and coverage gates. The published-package verification passes package identity, portable platform contracts and all 16 supported Laravel/PHP upgrade combinations.
Immutable source: fb3f3e59a4342fdebf8ced6160798906c3ee4387.
The self-hosted image update is being qualified in Server PR #292. Issue #599 remains open through published Server and affected-consumer verification. The attached counterfactual JUnit files document the source regression and Python candidate reproduction. They are separate from the published-package results above.
Add an optional cooperative workflow-task bridge for service adapters. Delivery persists the original request and authored call boundary while preserv
Add an optional cooperative workflow-task bridge for service adapters. Delivery persists the original request and authored call boundary while preserving the workflow lease for bounded cleanup.
Parallel delivery reserves the full durable sequence range. Selection handles identify their previously opened operation. Retries reuse the persisted marker, interrupted work is fenced, and terminal cleanup retains the original cancellation outcome.
Existing custom workflow-task bridges remain compatible. Worker protocol 1.19 is unchanged. The service request, observation and worker capability integration continues in durable-workflow/.github#136.
Implementation and qualification: #598
Fix portable cleanup command sequencing after cooperative cancellation delivery. The interrupted durable call now retains its position even when it ha
Fix portable cleanup command sequencing after cooperative cancellation delivery. The interrupted durable call now retains its position even when it had not opened an activity or wait, so subsequent cleanup uses the next sequence.
Includes retained cold-replay and database-backed bridge regression coverage. Existing terminal service cancellation behavior is unchanged. The separate cooperative service request remains tracked in durable-workflow/.github#136.
Implementation and qualification: #597
Portable workflow tasks now enforce the persisted cooperative cancellation cleanup deadline before lease renewal and command acceptance. At expiry, th
Portable workflow tasks now enforce the persisted cooperative cancellation cleanup deadline before lease renewal and command acceptance. At expiry, the engine cancels the original run, revokes open work and preserves one terminal cancellation linked to the original request.
Valid cleanup before the deadline and existing ordinary timeout behavior are preserved. The stable service /cancel operation remains terminal. This patch does not introduce a service cooperative request operation or advertise SDK cleanup support.
Qualified with the full source database, unit coverage, replay corpus and Laravel upgrade matrix. Published package verification runs on this exact tag. Server's pinned-image delivery is tracked separately in Server #286.
Fix and evidence: Workflow #595.
Workflow 2.2.21 reduces the projection work performed when ordinary sequential activities complete or finally fail in long-running workflows.
Workflow 2.2.21 reduces the projection work performed when ordinary sequential activities complete or finally fail in long-running workflows.
The regression tests cover canonical projection equivalence, transaction rollback and retry, duplicate completion, custom roles and competing workflow tasks. Repeated mixed-history measurements on MySQL and PostgreSQL and full Laravel 9–13 source qualification are recorded in the implementation PR.
Server 2.4.30 will ship this package update. Its image rebuild, publication and exact-image qualification are the next delivery step tracked on the owning issue.
Preserve UTC archive timestamps when loading workflow runs and summaries in applications using another timezone. Archive commands keep the correct ins
No database migration or worker protocol change is introduced by this patch.
Source qualification passed across MySQL, PostgreSQL and MariaDB, all five supported Laravel embedded-upgrade paths, static analysis, unit/coverage checks and dependency security audits.
Archive timestamp tracking: #588
Workflow 2.2.19 makes schedule starts idempotent for the same nominal UTC occurrence. A normal tick, backfill, or buffered action now records a clean
Workflow 2.2.19 makes schedule starts idempotent for the same nominal UTC occurrence. A normal tick, backfill, or buffered action now records a clean already_fired_occurrence skip if that occurrence has already started. The migration indexes occurrence keys and backfills existing schedule history; during a rolling upgrade, new schedulers also recognize unindexed events written by older processes. The schedule correctness guide documents daylight-saving folds and gaps, manual triggers, and backfill boundaries.
This release also reads the retention details_pruned_at marker as a UTC instant, preserving the correct time in API consumers such as Waterline across application timezones and daylight-saving transitions.
Qualification covered the schedule boundary scenarios with published Workflow 2.2.18 on SQLite, MySQL, PostgreSQL, and MariaDB, then verified the candidate fix across those databases. The exact release commit passed the full database, Laravel upgrade, quality, regression, and coverage matrix. The published-package verification passed, including Laravel 9–13 upgrades. A fresh install of the exact published 2.2.19 package passed the schedule boundary cases on all four databases and the retention serialization probe with published Waterline 2.0.7 on PostgreSQL 17. Download the raw synthetic evidence.
Run the Workflow package migrations before restarting schedule processing. Server images pin their own Workflow package version and need a separate update and image qualification. The schedule implementation and raw evidence and retention fix provide the source review.
Workflow 2.2.18 keeps accepted external signal inputs bounded in durable command and history records. The command retains the immutable payload refere
Workflow 2.2.18 keeps accepted external signal inputs bounded in durable command and history records. The command retains the immutable payload reference, and both workflow worker paths store large applied signal values through the configured external storage policy. Replay resolves the original bytes and preserves declared argument order, defaults and variadic arguments.
The change is covered by an external Avro signal regression, a cold-replay corpus fixture, bridge and contract tests, and the full MySQL, PostgreSQL, MariaDB, unit coverage, quality and supported Laravel upgrade matrix. Published-package verification passed, including Packagist source identity, the platform contract and supported Laravel upgrades. Packagist resolves this release to commit 09158ab3fb4cfa5e46e320e2d70853122af209cc.
Server pins its own Workflow package version. The Server ingress change and published-image conformance are tracked in Server #262. The implementation PR contains the source qualification evidence.
Workflow 2.2.17 adds a bounded, single-event projection path for terminal WorkflowCompleted and WorkflowFailed events. Server can use it to refresh th
Workflow 2.2.17 adds a bounded, single-event projection path for terminal WorkflowCompleted and WorkflowFailed events. Server can use it to refresh the selected-run timeline after recording the authenticated worker command, without loading or rewriting the rest of a long run's history. This package release alone does not update Server's separately pinned image.
a2724ec07e043ae814dbe9a46f1890f8c4fd4bde, the published platform contract matches, and supported Laravel upgrade jobs passed.Server's follow-through is tracked in Server #257 and PR #258. It will pin this exact package and verify the customer-visible result against a published Server image.
Workflow 2.2.16 reduces long-history projection work in three paths:
Workflow 2.2.16 reduces long-history projection work in three paths:
The source matrix passed. In an isolated candidate-source PostgreSQL check of a 4,046-entry history, the rollback-only timestamp diagnostic found 413 redundant updates before and zero after. The broader Server #237 workload verified the exact workflow result and ordered history with published Server 2.4.21 and Python SDK 2.3.5, but used an unreleased Workflow source overlay for these fixes. This release does not update Server's separately pinned Workflow dependency.
The immutable tag points to source commit f91bd13856d9258dd04bafa90b9f6eb8d0b67cb7. Published-package verification passed: Packagist resolved 2.2.16 to this commit, the published platform contract matched, and all supported Laravel 9 through 13 upgrade jobs passed.
Workflow 2.2.15 avoids rewriting unchanged timeline JSON payloads during projection. MySQL's JSON key normalization previously made equivalent payload
Workflow 2.2.15 avoids rewriting unchanged timeline JSON payloads during projection. MySQL's JSON key normalization previously made equivalent payloads appear dirty, causing repeated SQL updates across long workflow histories. The regression verifies that an equivalent payload causes no update and a genuinely changed payload still persists.
The fix and candidate-source evidence passed the full Workflow test matrix. An isolated 4,000-signal Server workload with eight activities, eight timers and continue-as-new verified the exact result and ordered history. Its rollback-only 100-entry diagnostic dropped from 100 redundant updates to zero. Timing results from that workload are a single paired observation and are not a published capacity rating.
Published-package verification passed. Packagist resolved 2.2.15, the published platform contract matched, and all supported Laravel 9 through 13 upgrade jobs passed. The immutable tag points to source commit ff73cea8c93f72f2d67b7473e17ce028762baf3a.
This release does not update the separately pinned Workflow dependency in the Server image. Server #237 tracks the wider long-history qualification and image follow-through.
Workflow 2.2.14 fixes backend capability checks when workflows.storage.connection selects a supported SQL database and the Laravel application default
Workflow 2.2.14 fixes backend capability checks when workflows.storage.connection selects a supported SQL database and the Laravel application default selects a different, unsupported driver. The capability snapshot now follows the same Workflow storage connection used by the models and migrations. An explicit database connection argument still takes precedence.
The regression test and fix passed unit, MySQL feature, regression-corpus, and quality checks. Published-package verification passed, including the supported Laravel 9 through 13 upgrade matrix. Packagist resolves 2.2.14 to source commit 2f3509954fc1afc867a21820e8307d29c17c878f.
Standalone Server images pin their Workflow package separately. Server 2.4.21 embeds Workflow 2.2.13.
Workflow 2.2.13 keeps repeated buffered signal admission bounded when an open workflow task and a complete run-summary projection are available. It up
Workflow 2.2.13 keeps repeated buffered signal admission bounded when an open workflow task and a complete run-summary projection are available. It updates the history budget, task diagnostics, and timeline without loading every earlier command and history event. The existing full projection path still handles first signals, incomplete summaries, runtime-reserved signals, and custom projection roles that do not implement the optional interface.
In three paired local SQLite runs of 200 signals with the worker stopped, total admission CPU fell from 19.73–19.90 seconds to 2.42–2.43 seconds. Last-50 signal p95 fell from 174.71–175.90 ms to 12.86–13.11 ms. Every run retained 200 received events and 200 pending signals. The fixture and raw results record the commands, SQL calls, memory, and limits of this measurement.
The exact-head full matrix passed MySQL, PostgreSQL, MariaDB, Laravel upgrades, coverage, and replay regression. This patch does not change the SDK wire protocol. Server images pin their own Workflow version, so Server #237 tracks the published image update and long-history qualification.
Workflow 2.2.12 records when retained workflow-run details are removed by retention cleanup. The nullable WorkflowRun.details_pruned_at timestamp is s
Workflow 2.2.12 records when retained workflow-run details are removed by retention cleanup. The nullable WorkflowRun.details_pruned_at timestamp is set in the same transaction as detail deletion, including when applications use a configured run model and storage connection. A repeated cleanup preserves the original timestamp. Rejected or rolled-back cleanup leaves it unset.
The marker is a supported read contract for operator tools such as Waterline. Null does not prove that details remain present: old prunes and genuinely empty histories cannot be distinguished without an authoritative record, so this release does not infer or backfill timestamps. Terminal status and run identity remain intact. Applications with a custom workflow_runs table must add a nullable details_pruned_at timestamp with microsecond precision as described in the API stability guide.
This patch does not change the SDK wire protocol. Source qualification: full database and Laravel matrix, release identity PR. The published-package verification workflow runs from this exact tag.
Workflow 2.2.11 fixes an early durable timer wakeup in poll mode. If a queue transport delivers a timer job before its durable deadline, the runtime n
Workflow 2.2.11 fixes an early durable timer wakeup in poll mode. If a queue transport delivers a timer job before its durable deadline, the runtime now queues another bounded wakeup. This also covers timers whose transport delay is capped for long waits.
The patch keeps ordinary poll-mode workflow and activity tasks on external polling. It does not change the public SDK protocol.
Source qualification: full pre-merge matrix and main-branch matrix. Server #230 tracks the downstream Server image adoption and published-artifact worker-stop check.
This patch preserves an unambiguous UTC instant for new workflow history events and stores timeline and wait projection timestamps consistently in UTC
This patch preserves an unambiguous UTC instant for new workflow history events and stores timeline and wait projection timestamps consistently in UTC. It fixes repeated-hour ambiguity for new history during autumn clock changes and prevents non-UTC projection timestamps from drifting or repeatedly appearing stale. See #556 and #555.
The new nullable recorded_at_utc column is added to the default and existing configured history-event tables. New writers retain the legacy local recorded_at field for older readers; new readers prefer the UTC value. The migration does not rewrite existing history. Old local timestamps whose offset was never stored cannot be corrected without independent evidence. Applications that create or replace a custom history-event table in their own migrations must include the nullable UTC column before starting new writers. During a rolling upgrade, keep old and new workers on a consistent PHP timezone and finish upgrading writers before relying on repeated-hour correctness.
After upgrading all projection writers, back up the database and inspect workflow:v2:rebuild-projections --needs-rebuild --dry-run --json. Rebuild affected derived rows, then confirm a second dry run selects no unchanged runs. The rebuild leaves authoritative history unchanged and cannot infer a missing old offset. See the history timestamp guide and projection timestamp guide.
The source fixes passed full 20-job matrices for history and projections, including supported Laravel upgrades, database feature shards and coverage. This patch does not change the SDK wire protocol.
This patch prevents a schedule tick from acting on a due occurrence that became stale before it acquired the schedule row lock. The tick now rechecks
This patch prevents a schedule tick from acting on a due occurrence that became stale before it acquired the schedule row lock. The tick now rechecks the captured occurrence against the locked schedule's current next_fire_at at UTC microsecond precision. An obsolete occurrence returns skipped with reason stale_occurrence, without advancing the schedule, applying an overlap policy, buffering, cancelling, terminating, or starting another workflow. Manual triggers and explicit backfill keep their existing behavior.
This corrects #551. Regression coverage includes concurrent tick snapshots, a manual trigger between selection and locking, all overlap policies, a completed run using the built-in PHP-class starter, and offset/microsecond comparisons. The exact-head source matrix passed before the patch release.
There is no new migration or worker protocol change in 2.2.9. Applications upgrading from a version before 2.2.8 should still follow the existing UTC schedule timestamp migration guidance from 2.2.8.
Workflow 2.2.8 fixes schedule firing across the repeated local hour when clocks fall back, including the Europe/Kyiv case reported in #548 . Absolute
Workflow 2.2.8 fixes schedule firing across the repeated local hour when clocks fall back, including the Europe/Kyiv case reported in #548. Absolute schedule timestamps are stored and queried as UTC instants, so a schedule survives a database reload and a fresh PHP process without shifting to the second occurrence of a repeated local time. The same focused regression covers spring transitions and the scheduler's due query.
The upgrade migration converts legacy local schedule timestamps using the configured application timezone. For applications that wrote them in a different timezone, set DW_V2_LEGACY_SCHEDULE_STORAGE_TIMEZONE for the migration. A legacy timestamp in a repeated local hour does not encode which occurrence the old writer meant; the migration preserves the instant the old code would have hydrated and documents this limit.
This is a patch release for the embedded Laravel schedule path. The worker wire protocol is unchanged. Source matrix: 36254886844. Published-package verification and Laravel upgrade matrix: 36255854281. Changes: #549 and #550.
Corrected stable patch release for the dedicated storage-connection watchdog repair from #546 . The runtime changes are the same as 2.2.6; package sou
Corrected stable patch release for the dedicated storage-connection watchdog repair from #546. The runtime changes are the same as 2.2.6; package source metadata now identifies the exact 2.2.7 release so published-package conformance can verify it. v2 task repair, activity timeout enforcement, worker-compatibility heartbeats, and the v1 watchdog use their model storage connection for engine-table checks. Default-connection behavior and wire protocols are unchanged. The 2.2.6 tag remains immutable and should not be used as a qualified release.
Superseded by 2.2.7 . Do not select 2.2.6 for new installs. The 2.2.6 published-package verification failed because its bundled product-train metadata
Superseded by 2.2.7. Do not select 2.2.6 for new installs. The 2.2.6 published-package verification failed because its bundled product-train metadata identified 2.2.5. The immutable tag was not rewritten; 2.2.7 contains the same storage-connection repair with corrected source identity and passed published-package/Laravel upgrade verification.
This patch repairs watchdog table checks for embedded Laravel installations with a dedicated workflows.storage.connection. The v2 task watchdog, worker-compatibility heartbeats, and v1 watchdog now inspect engine tables on the configured storage connection rather than the application default. Default-connection behavior, API, and schema are unchanged.
Patch release for failed local-activity Avro payload persistence. New failed, timed-out and cancelled local-activity exceptions are encoded with the r
Patch release for failed local-activity Avro payload persistence. New failed, timed-out and cancelled local-activity exceptions are encoded with the run codec; an idempotent migration repairs legacy plain-text exceptions in execution rows and terminal history snapshots. Cold replay and history import regression evidence is included. No SDK wire-protocol change.
Qualified patch release of the CarbonImmutable compatibility fix from 2.2.3. Embedded v2 activity leases and standalone activity starts accept immutab
Qualified patch release of the CarbonImmutable compatibility fix from 2.2.3. Embedded v2 activity leases and standalone activity starts accept immutable application dates; worker compatibility summaries retain immutable heartbeat timestamps. This tag also aligns the packaged Workflow source-release identity with 2.2.4. No portable protocol change.
The CarbonImmutable runtime fix in this tag is superseded by 2.2.4. The 2.2.3 published-package verification failed because its packaged source-releas
The CarbonImmutable runtime fix in this tag is superseded by 2.2.4. The 2.2.3 published-package verification failed because its packaged source-release identity still reported 2.2.2; use 2.2.4 instead. No published tag was moved or reused.
Qualified patch release for the MySQL operator-surface metadata optimization introduced in 2.2.1. One fresh table listing per connection/schema replac
Qualified patch release for the MySQL operator-surface metadata optimization introduced in 2.2.1. One fresh table listing per connection/schema replaces repeated metadata queries while preserving targeted fallback and immediate schema-drift detection. Also corrects the packaged source-release identity that caused 2.2.1 release verification to fail. No public workflow API change.
Superseded by Workflow 2.2.2 . Do not use 2.2.1 as a qualified release: its published-package check failed because its source-release identity remaine
Superseded by Workflow 2.2.2. Do not use 2.2.1 as a qualified release: its published-package check failed because its source-release identity remained 2.2.0. The immutable tag was not rewritten.
Reduce MySQL operator-surface readiness metadata checks to one fresh table listing per connection and schema. Keep targeted fallback for missing or non-identical names, immediate schema-drift detection, and the existing behavior on other databases or older Laravel versions. No public workflow API change.
Embedded cooperative cancellation
WorkflowStub::requestCancellation() for a durable, idempotent cancellation request with a bounded cleanup deadline.finally can run durable cleanup activities. Use cancellationShield() to let cleanup already in progress finish.cancel() and terminate() behavior unchanged. A cleanup deadline still falls back to terminal cancellation.This capability is embedded PHP only. The standalone Server and service-mode PHP, Python, and Rust SDKs do not yet expose this cooperative request protocol. Cleanup activities should be idempotent; forced termination and external side effects cannot be guaranteed to finish.
Adds validated failed-run redrive from an activity boundary, including reused activity history and provenance. Also corrects the package release ident
Adds validated failed-run redrive from an activity boundary, including reused activity history and provenance. Also corrects the package release identity so published-artifact verification succeeds. Server and SDK integrations are being qualified separately before the service-mode redrive feature is announced.
Record unambiguous failed activity step for future redrive
Only mark the failed sequence when an activity failure propagates. A workflow exception after an activity succeeds must not imply that the activity should be retried.
test(v2): cover replay of completed activity prefix for redrive
fix(v2): mark activity redrive boundary only for propagated failure
feat(v2): validate failed-run activity replay source
test(v2): qualify redrive plan against persisted failure
Draft embedded failed-run redrive with reused activity provenance
Preserve redrive replay time across query reconstruction
Preserve redrive lineage through embedded history import
Prove redriven run survives source history expiry
Preserve redrive replay clock in cold fiber runs
Verify service worker activity-failure redrive boundary
Preserve uncaught activity failure identity in worker commands
Require recorded worker definition for service redrive
Mark worker-owned workflow definition identity in history
Preserve workflow timeouts across failed-run redrive
Format redrive timeout handling
Reject redrive when activity history advances past failure
Co-authored-by: Durable Workflow support@durable-workflow.com
Corrects the published source-release identity for the v2-only install option introduced in 2.0.18. Set DW_V1_ENABLED=false before a fresh install to
Corrects the published source-release identity for the v2-only install option introduced in 2.0.18. Set DW_V1_ENABLED=false before a fresh install to omit legacy embedded v1 tables; existing installs retain the enabled default.
Superseded by 2.0.19 : the v2-only install behavior is the same, but 2.0.19 corrects the packaged source-release identity and passed published-release
Superseded by 2.0.19: the v2-only install behavior is the same, but 2.0.19 corrects the packaged source-release identity and passed published-release verification.
Full Changelog: 2.0.17...2.0.18
Resolve caller ID reservation against committed MySQL rows by @rmcdaniel in #518
Full Changelog: 2.0.16...2.0.17
Fix large inline history handling on MySQL without increasing database limits.
Fix large inline history handling on MySQL without increasing database limits.
Validated with native MySQL 8.0.43 defaults, SQLite, PostgreSQL, MariaDB, Laravel 9-13 source upgrades, and a PHP SDK large-payload workflow/activity journey. See #517 for qualification details. Server image follow-through is tracked in #515.
Readiness consumers can now preserve original schema-inspection exceptions with WaterlineEngineSource::status(throwOnInspectionFailure: true) . This l
Readiness consumers can now preserve original schema-inspection exceptions with WaterlineEngineSource::status(throwOnInspectionFailure: true). This lets a runtime distinguish a temporary database disconnect from genuinely missing tables instead of losing the database error classification.
Default Waterline diagnostics and engine selection are unchanged. This patch has no database migration or wire-format change. Server must explicitly adopt the option; upgrading this library alone does not update an existing Server image.
Implementation: #516. Server adoption: durable-workflow/server#165.
Source validation passed: https://github.com/durable-workflow/workflow/actions/runs/35644831588 (MySQL, PostgreSQL, MariaDB, Laravel 9–13 upgrades, static analysis, regression corpus, and coverage). Published-package verification follows through the repository release workflow.
WaterlineEngineSource::status(throwOnInspectionFailure: true). Temporary
database connection failures can then be distinguished from genuinely missing
tables. Default Waterline diagnostics and engine selection are unchanged.Deterministic workflow time no longer shares mutable Carbon objects with callers. Deriving a deadline with Workflow::now()->addHour() cannot advance t
Deterministic workflow time no longer shares mutable Carbon objects with callers. Deriving a deadline with Workflow::now()->addHour() cannot advance the workflow clock or expire that deadline immediately. Mutating an object supplied to WorkflowFiberContext::setTime() also cannot change stored time.
Timestamp precision, timezones, Carbon mutable/immutable types, history-based advancement, and the wall-clock fallback outside workflows are preserved. No wire-format or database-schema change.
Upgrade the durable-workflow/workflow dependency and restart long-running PHP workers so they load the fix.
Implementation and regression evidence: #512 (fixes #511).
Source validation: https://github.com/durable-workflow/workflow/actions/runs/34685503210 . Full MySQL, PostgreSQL, MariaDB, supported Laravel-major upgrades, static analysis, regression corpus and coverage passed. Published-package verification follows through the repository release workflow.
Workflow::now()->addHour() no longer advances workflow time or
expires the deadline immediately. Mutating a timestamp supplied to the fiber
context cannot change its stored time either. History-based clock advancement,
timestamp precision, timezones, and mutable or immutable Carbon types remain
unchanged.Reduce repeated work during full monitoring projection.
Reduce repeated work during full monitoring projection.
No public API, database schema, durable history, or portable payload protocol change. Full-history projection remains history-dependent; this release does not claim constant-time replay or new production capacity.
Fix: #508 / #509. Release metadata: #510.
The full source matrix passed unit/coverage, MySQL, PostgreSQL, MariaDB, Laravel 9-13 upgrade, quality, and regression checks. Published-package verification and affected-consumer delivery remain tracked in #508.
Fix schedule dispatch at exact timestamp boundaries.
Fix schedule dispatch at exact timestamp boundaries.
Fix: #505 / #506. Release metadata: #507.
Full scheduler-fix main CI passed MySQL, PostgreSQL, MariaDB, Laravel upgrade, coverage and regression checks. Publication verification and affected-consumer updates are tracked in #505.
Activities cannot bypass an elapsed deadline after a worker's lease expires. Task claiming preserves the elapsed deadline until the normal timeout swe
Activities cannot bypass an elapsed deadline after a worker's lease expires. Task claiming preserves the elapsed deadline until the normal timeout sweep settles it, including when an earlier worker already repaired the lease.
Schedule-to-close remains an overall deadline across worker restarts. The fix refuses late activity completion and avoids starting an extra activity effect after that deadline.
No schema migration or configuration change is required.
Fixes Laravel's native mariadb connection being rejected by operator readiness and portable parity validation. Native MariaDB and the existing MySQL-d
Fixes Laravel's native mariadb connection being rejected by operator readiness and portable parity validation. Native MariaDB and the existing MySQL-driver MariaDB path are both covered in CI.
Thanks to @beschoenen for #500.
Validation: the complete main-branch test matrix and dependency security checks passed. Published-package verification runs after release.
Full changes: 2.0.9...2.0.10
mariadb database driver in backend readiness and
capability reporting. MariaDB no longer appears unsupported when configured
with its own driver instead of mysql. Both driver paths retain real-database
locking and history checks; the native driver also exercises readiness and replay.Fix terminal activity timeout replay so workflow catch and finally blocks can recover and perform cleanup. The fix covers ordinary and local activitie
Fix terminal activity timeout replay so workflow catch and finally blocks can recover and perform cleanup. The fix covers ordinary and local activities, including existing persisted timeout histories, without application exception mappings.
Fix: #498. Implementation and regression coverage: #499.
Full main-branch validation passed, including MySQL/PostgreSQL feature matrices, supported Laravel upgrade checks, replay regression coverage, static analysis, and coverage. Published-package verification runs for this release.
Fixes child completion defects reported in #493 and #495 .
Fixes child completion defects reported in #493 and #495.
No database migration, public API or payload-format change. Existing histories with contradictory terminal events are not automatically rewritten.
Qualified runtime: https://github.com/durable-workflow/workflow/actions/runs/34231911269 (full MySQL/PostgreSQL matrix, MariaDB checks, Laravel 9-13 upgrades, replay corpus and unit coverage). Final release metadata and required PR checks: https://github.com/durable-workflow/workflow/actions/runs/34233053446 . Published-package verification follows publication.
Standalone Server images require a separate dependency update; this package release does not deploy Server or Cloud.
Fixes eager external-payload decoding during activity metadata projection ( #491 ). Summary, task, wait and parallel-child checks preserve lifecycle a
Fixes eager external-payload decoding during activity metadata projection (#491). Summary, task, wait and parallel-child checks preserve lifecycle and typed-history metadata without downloading activity arguments/results. Explicit decoded activity views retain their existing behavior.
Qualified with the full source test matrix, Laravel 9-13 upgrades and unit coverage: https://github.com/durable-workflow/workflow/actions/runs/34205502106. The release metadata checks passed in #492. Published-package verification runs separately after publication.
This engine patch supports the bounded Server external-payload fix under development in durable-workflow/server#142; it does not deploy or release Server.
Fixes Nexus service-call history projection throwing during workflow-task completion. Started, completed, failed, and cancelled events now retain thei
Fixes Nexus service-call history projection throwing during workflow-task completion. Started, completed, failed, and cancelled events now retain their call identity and project an operation summary without payload contents. No database migration or protocol change. Fix: #488; release metadata: #489. Full database, coverage, quality, and supported Laravel upgrade checks passed on the implementation; release metadata checks passed before tagging. Published-package verification follows this immutable tag.
Fixes early delayed-job delivery exhausting activity and timer transport attempts. Fractional-second wakeups round up without changing durable deadlin
Fixes early delayed-job delivery exhausting activity and timer transport attempts. Fractional-second wakeups round up without changing durable deadlines; early wakeups use fresh jobs while business retry limits remain unchanged. Long SQS timers relay through capped 900-second dispatches.
Fix: #485. Release metadata: #486. Full database, coverage, and Laravel upgrade checks passed for the correction. No database migration or protocol change.
Your coding agent can read these notes before it upgrades. Set up the MCP server →