github durable-workflow/workflow 2.23.1

one hour ago

Fixes

  • Saga compensation and cancellation: embedded compensate() now runs under a cancellation shield, as the PHP and Python SDK sagas do. A cooperative cancellation request that arrives during compensation no longer skips the remaining compensations. Cleanup deadlines, termination and run timeouts still apply (#872).
  • Updates accepted while a run is closing: an update accepted while the workflow task that completes the run is running now gets one delivery turn before the run closes, as a signal does. Its handler runs and the caller gets its result instead of a closed-run failure (#890).
  • Activity attempt budgets: a new activity or local activity with maxAttempts below 1 now fails the run with a clear message, because the budget counts the first attempt. Previously it silently ran once. For unlimited attempts, omit maxAttempts and set the activity class $tries to 0. Histories that recorded maxAttempts: 0 under an earlier release keep replaying after the upgrade (#860).
  • Determinism scan: the embedded boot scan now flags new DateTime(), new DateTimeImmutable(), new Carbon() and new CarbonImmutable() when they read the current time, plus today(), shuffle, array_rand and str_shuffle. Fixed dates are not flagged (#888).
  • Service-mode payload limits: activity, child and continue-as-new arguments and workflow results from SDK workers now get the same payload size limit embedded workflows have. Oversized payloads refuse the whole completion with the typed structural-limit failure (#865).

Compatibility

No database migration, history format or dependency floor change.

Don't miss a new workflow release

NewReleases is sending notifications on new releases.