diff --git a/CHANGELOG.md b/CHANGELOG.md index 4ca1c0a..e8fe20a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,15 @@ project follows [Semantic Versioning](https://semver.org/). before acquiring more work. Task and cancellation authority deadlines retain their original bounds. +## [2.5.0] - 2026-10-18 + +### Added + +- Replay cooperative cancellation at an original completion-waiting Nexus + service call. Cooperative workers advertise support for the owned + `workflow_run` binding. Delivery requires a compatible runtime and preserves + the original cancellation request and cleanup deadline. + ## [2.4.2] - 2026-10-15 ### Fixed diff --git a/composer.json b/composer.json index 2239ec9..69b3012 100644 --- a/composer.json +++ b/composer.json @@ -82,7 +82,7 @@ } }, "durable-workflow": { - "product-train": "2.4.2", + "product-train": "2.5.0", "supported-server-versions": "2.5.0", "worker-protocol-version": "1.20", "control-plane-version": "2", diff --git a/docs/portal/build/workflows-activities.md b/docs/portal/build/workflows-activities.md index 4db697b..2c2e655 100644 --- a/docs/portal/build/workflows-activities.md +++ b/docs/portal/build/workflows-activities.md @@ -67,9 +67,6 @@ fresh-construction correction is not released. ## Call a registered service -This authoring API is introduced in the PHP SDK 2.3 prerelease. Install it with -`composer require durable-workflow/sdk:^2.3@RC`. - Use `serviceOperation()` inside a workflow to invoke a Server service endpoint. The call pauses until Server records its result. Worker restarts replay the same call identity and result without submitting another operation. @@ -110,6 +107,13 @@ Service operations currently run sequentially outside cancellation scopes and operation groups. The worker reports `service_operations_unavailable` when the connected runtime does not advertise the command. +With cooperative cancellation enabled, a completion-waiting call can deliver +cancellation at its original service-call boundary. The runtime must advertise +`nexus_cooperative_cancellation` for the `workflow_run` binding. The caller +keeps its original cleanup deadline while its owned target finishes cleanup. +Admission-only calls do not gain this waiting boundary, and returning an +existing workflow does not grant cancellation ownership over it. + ## Fan out durable work and join it once `all()` (also available as `parallel()`) captures one durable operation from each closure, schedules every leaf in one workflow-task completion, then suspends the Fiber until the group can join. The returned array always follows declaration order, even when the Server records completions in another order: diff --git a/docs/quickstart-contract.json b/docs/quickstart-contract.json index 54a3cb1..39cd3cb 100644 --- a/docs/quickstart-contract.json +++ b/docs/quickstart-contract.json @@ -3,9 +3,9 @@ "schema_version": 2, "package": { "name": "durable-workflow/sdk", - "published_version": "2.4.2", - "composer_requirement": "2.4.2", - "onboarding_requirement": "^2.4" + "published_version": "2.5.0", + "composer_requirement": "2.5.0", + "onboarding_requirement": "^2.5" }, "runtime_targets": { "server": {