Skip to content

Commit 4e4b9c8

Browse files
Release 0.3.0
Cuts the Unreleased section with entries accumulated since 0.2.0 — plane-scoped tokens, Worker.run_until, order-processing example, ctx.wait_condition, workflow signal/query/update decorators, in-process testing harness, activity retry policy, ctx.sleep, metrics hooks, cluster-info manifest compatibility checks, get_result codec decode, and the #432 canonical-PascalCase event_type tightening.
1 parent 2e6a4b7 commit 4e4b9c8

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
## [0.3.0] — 2026-04-19
10+
911
### Added
1012
- Plane-scoped SDK bearer tokens: `Client(..., control_token=..., worker_token=...)`
1113
and the sync wrapper now support least-privilege server deployments where
@@ -17,17 +19,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1719
- A Docker Compose order-processing example under `examples/order_processing`
1820
that starts a local server and runs a multi-activity Python workflow
1921
end-to-end.
22+
- `ctx.wait_condition(...)` durable primitive with replayer support, for
23+
workflows that pause until a signal- or update-driven predicate holds.
24+
- `@workflow.signal`, `@workflow.query`, and `@workflow.update` decorators
25+
with in-workflow dispatch: signals apply during replay, queries execute
26+
against a replayed workflow instance, and updates run on a worker with
27+
acceptance + application recorded in history.
28+
- `ctx.sleep(seconds)` sugar over `StartTimer` for readability.
29+
- In-process `WorkflowEnvironment` testing harness that boots a worker
30+
and client against a fake server for unit-style tests without Docker.
31+
- Activity retry policy support: `ActivityRetryPolicy(...)` on
32+
`ctx.schedule_activity(...)` serializes retry bounds onto the
33+
server-side command.
34+
- SDK metrics hooks (`MetricsRecorder` / `PrometheusMetricsRecorder`)
35+
for worker-side operational telemetry.
2036

2137
### Changed
2238
- Worker compatibility checks now use `/api/cluster/info` protocol manifests
23-
as the authority instead of the top-level server app version. SDK 0.2.x
39+
as the authority instead of the top-level server app version. SDK 0.3.x
2440
requires `control_plane.version: "2"`,
2541
`control_plane.request_contract` schema
2642
`durable-workflow.v2.control-plane-request.contract` version `1`, and
2743
`worker_protocol.version: "1.0"`. Missing, unknown, or undiscoverable
2844
compatibility states fail closed.
2945
- `Client.get_result()` now decodes `WorkflowCompleted` output with the event
3046
or workflow payload codec instead of assuming JSON.
47+
- History-event decoding in `client.py` and `workflow.py` now requires the
48+
server's canonical PascalCase `event_type` values (`WorkflowCompleted`,
49+
`ActivityCompleted`, `TimerFired`, etc.). The prior snake_case fallback
50+
and the `output`-or-`result` key fallback on `WorkflowCompleted` have
51+
been removed; unknown event-type shapes are ignored instead of silently
52+
tolerated. (#432)
3153

3254
## [0.2.0] — 2026-04-17
3355

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
44

55
[project]
66
name = "durable-workflow"
7-
version = "0.2.0"
7+
version = "0.3.0"
88
description = "Python SDK for the Durable Workflow server (language-neutral HTTP protocol)"
99
readme = "README.md"
1010
requires-python = ">=3.10"

0 commit comments

Comments
 (0)