From 5c45432ff0937cba793b3e53b5e8c58045169cdb Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Wed, 11 Nov 2026 22:01:24 +0000 Subject: [PATCH 1/2] Prepare Workflow 2.24.0 product metadata and release notes Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 15 +++++++++++++++ composer.json | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ca8165b7e..7d12206be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Unreleased +## 2.24.0 - 2026-11-11 + - Activity heartbeats no longer grow run history with every heartbeat (#870). Each heartbeat still renews the lease, moves the heartbeat deadline and stores the latest progress on the attempt. An @@ -16,6 +18,19 @@ - A migration adds nullable `last_heartbeat_progress`, `last_heartbeat_progress_at` and `last_heartbeat_recorded_at` columns to `activity_attempts`. It is additive, with no backfill. +- Re-applying an unchanged schedule records nothing and keeps the next fire + time and its jitter; `changed_fields` lists only fields whose stored value + changed, and only a spec or jitter change moves the next fire, so + metadata-only updates cannot skip a due occurrence (#876, #1089). +- Creating a schedule with a taken id, including a deleted or + `max_runs_exhausted` schedule, raises + `Workflow\V2\Exceptions\ScheduleAlreadyExistsException` instead of a raw + database error, matching the Server's `409 schedule_already_exists` + (#876, #1090). +- Operator metrics report open runs whose workflow task cannot replay + (`runs.replay_blocked`, `oldest_replay_blocked_at`, + `max_replay_blocked_age_ms`), and a new advisory `replay_blocked_runs` + health check warns while any exist (#861, #1091). ## 2.23.2 - 2026-11-11 diff --git a/composer.json b/composer.json index b77749fb0..f7c038f51 100644 --- a/composer.json +++ b/composer.json @@ -87,7 +87,7 @@ "dev-main": "2.0.x-dev" }, "durable-workflow": { - "product-train": "2.23.2", + "product-train": "2.24.0", "laravel-embedded-upgrade-contract": "resources/laravel-embedded-upgrade-contract.json", "laravel-dependency-security-policy": "resources/laravel-dependency-security-policy.json" }, From 164486ed829194f64df73b61e96880c3b300465d Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Wed, 11 Nov 2026 22:01:35 +0000 Subject: [PATCH 2/2] Avoid semicolons in the 2.24.0 notes Co-Authored-By: Claude Opus 5.5 --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d12206be..34dd8d372 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -19,8 +19,8 @@ `last_heartbeat_progress_at` and `last_heartbeat_recorded_at` columns to `activity_attempts`. It is additive, with no backfill. - Re-applying an unchanged schedule records nothing and keeps the next fire - time and its jitter; `changed_fields` lists only fields whose stored value - changed, and only a spec or jitter change moves the next fire, so + time and its jitter. `changed_fields` lists only fields whose stored value + changed. Only a spec or jitter change moves the next fire, so metadata-only updates cannot skip a due occurrence (#876, #1089). - Creating a schedule with a taken id, including a deleted or `max_runs_exhausted` schedule, raises