From e708bc3608743a84f2a932c5969e34cd35face9e Mon Sep 17 00:00:00 2001 From: Richard McDaniel <1130888+rmcdaniel@users.noreply.github.com> Date: Fri, 13 Nov 2026 06:14:58 +0000 Subject: [PATCH] Prepare 2.8.0: workflow update outcome reads Co-Authored-By: Claude Opus 5.5 --- docs/release-notes/2.8.0.md | 55 +++++++++++++++++++++++++++++++++++++ rust/Cargo.lock | 2 +- rust/Cargo.toml | 2 +- 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 docs/release-notes/2.8.0.md diff --git a/docs/release-notes/2.8.0.md b/docs/release-notes/2.8.0.md new file mode 100644 index 0000000..620ab3a --- /dev/null +++ b/docs/release-notes/2.8.0.md @@ -0,0 +1,55 @@ +Durable Workflow CLI 2.8.0 + +## Read an update's outcome later + +2.8.0 adds `dw workflow:update-outcome` for native Server 3.6.0's update +outcome reads (server#1131, durable-workflow/.github#212, cli#144). When +`dw workflow:update` returns before the update finishes, for example after its +`--wait=completed` wait runs out, you can read the outcome later by update id +instead of sending the update again. + +```bash +dw workflow:update-outcome order-123 01JUPDATE00000000000000000 +dw workflow:update-outcome order-123 01JUPDATE00000000000000000 --wait=completed --wait-timeout=30 +``` + +- **One read, never a resend.** The command sends one + `GET /api/workflows/{workflow_id}/updates/{update_id}`. It never sends a + POST and never submits the update again. +- **Pending is not null.** A 202 `accepted` answer prints "Update accepted, + not finished yet" with a hint to run again with `--wait=completed`. A + completed update prints its `result_envelope`, even when it encodes null. +- **Final outcomes keep their exit codes.** A failed update exits 2 with the + Server's `failure_message`, as `workflow:update` does. A rejected update + keeps its original rejection status. An unknown or pruned update id + (404 `update_not_found`) exits 5; that does not prove the update was never + admitted. +- **`--wait`** is `accepted` (the default, answers at once) or `completed`. + **`--wait-timeout`** needs `--wait=completed` and a whole number of seconds + of at least 1. Bad values send nothing. +- **`--json`** returns the Server receipt with `namespace` added. Nothing is + printed until the receipt is checked against the requested workflow and + update ids. +- **`workflow:update`** now prints the matching `workflow:update-outcome` + command after an accepted but unfinished update, only when the Server + advertises the capability. + +The command needs a Server that advertises +`capabilities.update_outcome_reads` (native 3.6.0 or later). Against any other +Server, including published PHP Server 2.x, it exits with code 8 before sending +anything, and `workflow:update` output is unchanged. The new command makes +abbreviations such as `workflow:upd` ambiguous; the exact name +`workflow:update` still resolves. + +## Release builds + +Every Linux job that reaches `setup-php`, in CI and in the release workflows, +now turns off APT retries first (cli#143, durable-workflow/.github#295). This +changes how release artifacts are built, not what they contain. + +## Unchanged + +Every other command behaves as in 2.7.0. A parity suite still compares `dw` +with the 2.x CLI on every change, offline and against published PHP Server +2.11.8 and native Servers 3.0.5 and 3.5.0. The 2.3.x PHAR line receives +security fixes only until 2027-02-28. diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 17d4f8a..93ff273 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -289,7 +289,7 @@ dependencies = [ [[package]] name = "dw" -version = "2.7.0" +version = "2.8.0" dependencies = [ "durable-workflow", "getrandom 0.2.17", diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 06f4799..50b774b 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "dw" -version = "2.7.0" +version = "2.8.0" edition = "2021" rust-version = "1.86" description = "Command-line interface for Durable Workflow Server and Cloud"