github durable-workflow/workflow 2.18.0

2 hours ago

Failed-run redrive recovers more ordinary workflows, keyed signals and updates keep their admissions, and V2 explains the Eloquent models it rejects.

Redrive (#864)

  • Start-time memos and search attributes carry to the successor (#985).
  • Run detail and describe report can_redrive and redrive_blocked_reason, using the same decision redrive() applies (#990).
  • Side effects and version markers in the completed prefix are reused instead of run again (#991).
  • Plain fired timers are recorded as already fired, so the successor doesn't wait again (#992).
  • Reused steps carry reused_from_run_id and reused_recorded_at, and replay uses the original time, so now() after a reused step matches the source run.
  • New refusal reasons are listed in the CHANGELOG. Workflow-code memo/search-attribute upserts, signals and updates in the prefix are still refused in this release.

Keyed signals and updates (#877)

A retry with the same caller key returns the retained admission. Reusing a key for a different name, typed arguments or explicit run target is refused without durable writes. Caller keys must be valid UTF-8, 1 to 255 code points.

Eloquent model arguments (#997, #998)

Passing an Eloquent model, ModelIdentifier or Eloquent collection across a V2 payload boundary fails with an unsupported_value_type message that names the model class and says to pass the key and load the model inside the activity. Before, the message named Laravel's internal ModelIdentifier type.

Rejected late activity outcomes (#878, #901)

The first refused completion or failure from an expired or superseded attempt appends one ActivityOutcomeRejected event. It records the attempt identity, lease owner, attempted outcome, refusal reason and observation time. It is payload-free: the result, failure, stack and request snapshot are never stored. It grants no business outcome, renews no lease and changes no retry.

Upgrade notes

  • Migration (#877): adds the nullable workflow_commands.intent_digest column, with no backfill. Run migrations, then drain and upgrade all embedded database writers together.
  • Rollback floor (#901): readers have understood ActivityOutcomeRejected since 2.13.0. After this release writes one, do not roll back below 2.13.0. Rolling back within 2.13.0 and later is fine.
  • Service mode: redrive successors record the reuse keys above. SDK replay parity is tracked in durable-workflow/sdk-python#232, durable-workflow/sdk-php#240 and durable-workflow/sdk-rust#164. Native Server redrive parity is durable-workflow/server#980.

Main CI was green at 36dc304d (merge of #1003). Release Verification runs on this tag.

Don't miss a new workflow release

NewReleases is sending notifications on new releases.