@@ -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
0 commit comments