Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased]

## [2.5.15] - 2026-10-15

### Fixed
- Bound query payload loading, replay and async handler execution to the
original query deadline and lease. Use non-renewing authority observations
when Server 2.8.0 advertises them, with explicit older-Server/1.19 limits.
- Reuse identical external references within one query response and retain
the original typed caller timeout. Add optional pre-registration enforcement
with `require_query_task_authority=True`.

## [2.5.14] - 2026-10-14

### Fixed
- Document schedule backfill as a start-inclusive, end-exclusive window.
An occurrence at the end belongs to the next adjacent window.

## [2.5.13] - 2026-10-13

### Fixed
Expand Down
24 changes: 24 additions & 0 deletions docs/reference/client.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,28 @@ Workflow authors should normally yield `ctx.call_nexus_service(...)`; the
worker uses this client method to execute once and record the durable result
or typed service failure.

## Backfill windows

`Client.backfill_schedule()` includes the start time and excludes the end time:
`[start_time, end_time)`. An occurrence exactly at `end_time` is excluded.

Adjacent windows share a boundary without overlapping it:

```python
await client.backfill_schedule(
"daily-orders",
start_time="2026-03-08T07:00:00Z",
end_time="2026-03-08T07:30:00Z",
)
await client.backfill_schedule(
"daily-orders",
start_time="2026-03-08T07:30:00Z",
end_time="2026-03-08T08:00:00Z",
)
```

An occurrence at `07:30:00Z` belongs to the second window. Repeating a window
does not start another workflow for an occurrence already admitted by that
schedule.

::: durable_workflow.client
6 changes: 3 additions & 3 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"

[project]
name = "durable-workflow"
version = "2.5.14"
version = "2.5.15"
description = "Python client and worker SDK for Durable Workflow Cloud and self-hosted Server"
readme = "README.md"
requires-python = ">=3.10"
Expand Down Expand Up @@ -71,8 +71,8 @@ durable-workflow-replay-conformance = "durable_workflow.replay_conformance:main"
durable-workflow-workflow-updates-conformance = "durable_workflow.workflow_updates_conformance:main"

[tool.durable-workflow]
product-train = "2.5.14"
registry-version = "2.5.14"
product-train = "2.5.15"
registry-version = "2.5.15"
supported-server-versions = "2.8.0"
worker-protocol-version = "1.20"
control-plane-version = "2"
Expand Down
4 changes: 3 additions & 1 deletion src/durable_workflow/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -4845,8 +4845,10 @@ async def backfill_schedule(
end_time: str,
overlap_policy: str | None = None,
) -> ScheduleBackfillResult:
"""Fire a schedule for every would-have-been moment in ``[start_time, end_time]``.
"""Fire a schedule for every would-have-been moment in ``[start_time, end_time)``.

The start is inclusive and the end is exclusive. An occurrence equal
to ``end_time`` is excluded and belongs to the next adjacent window.
Times are ISO-8601 strings. Useful to replay a period the schedule
was paused or to seed historical runs. The returned
:class:`ScheduleBackfillResult` reports how many fires were attempted
Expand Down
Loading