From 1004224f01182b0e3815caaf4cf6c97a4d6a9086 Mon Sep 17 00:00:00 2001 From: Tim Conley Date: Wed, 28 Oct 2026 12:05:19 -0700 Subject: [PATCH] Prepare release 1.35.0 --- CHANGELOG.md | 138 ++++++++++++++++++ changelog/added/boomeranging-bellhop.md | 1 - changelog/added/bouncing-cloudberry.md | 1 - changelog/added/chiming-jellyfish.md | 1 - changelog/added/chuckling-chameleon.md | 1 - changelog/added/dancing-otter.md | 1 - changelog/added/discerning-murlock.md | 1 - changelog/added/leapfrogging-lemur.md | 2 - changelog/added/lignicolous-luisa.md | 1 - changelog/added/patient-puffin.md | 1 - changelog/added/spiraling-sparrow.md | 1 - changelog/added/unhurried-hedgehog.md | 1 - .../breaking-changes/bumbling-bumblebee.md | 1 - .../breaking-changes/cartwheeling-cupcake.md | 1 - .../breaking-changes/sauntering-salamander.md | 1 - changelog/breaking-changes/sleepy-unicorn.md | 1 - .../breaking-changes/tap-dancing-turtle.md | 1 - .../vigilant-validator-vole.md | 1 - changelog/breaking-changes/waltzing-walrus.md | 1 - changelog/changed/dancing-marshmallow.md | 1 - changelog/fixed/abstract-albatross.md | 1 - changelog/fixed/bouncing-badger.md | 1 - changelog/fixed/byssoid-ismael.md | 1 - changelog/fixed/cheerful-chinchilla.md | 1 - changelog/fixed/context-free-capybara.md | 1 - changelog/fixed/giggling-teapot.md | 1 - changelog/fixed/impatient-pangolin.md | 1 - changelog/fixed/joining-pathfinder.md | 1 - changelog/fixed/juggling-jellyfish.md | 1 - changelog/fixed/marshmallow-moonwalk.md | 1 - changelog/fixed/moonwalking-muffin.md | 1 - changelog/fixed/nonprocessional-gauge.md | 1 - changelog/fixed/orderly-otter.md | 1 - changelog/fixed/patient-namespace-newt.md | 1 - changelog/fixed/patient-porcupine.md | 1 - changelog/fixed/patient-tortoise.md | 1 - changelog/fixed/perkier-pamila.md | 1 - changelog/fixed/polka-dot-penguin.md | 1 - changelog/fixed/prancing-puffin.md | 1 - changelog/fixed/relay-racing-raccoon.md | 1 - changelog/fixed/rewinding-raccoon.md | 1 - changelog/fixed/rounded-pebble-skipping.md | 1 - changelog/fixed/sheepish-sandbox-otter.md | 1 - changelog/fixed/skipping-squirrel.md | 1 - changelog/fixed/sleepy-lighthouse.md | 1 - changelog/fixed/sleepy-otter-stream.md | 2 - changelog/fixed/snoozing-nexus-otter.md | 1 - changelog/fixed/snoozing-sloth.md | 1 - changelog/fixed/somersaulting-sloth.md | 1 - changelog/fixed/stubborn-nexus-heron.md | 1 - changelog/fixed/talkative-tortoise.md | 1 - changelog/fixed/time-hopping-marmot.md | 1 - changelog/fixed/timeless-tortoise.md | 1 - changelog/fixed/tiptoeing-terrapin.md | 1 - changelog/fixed/tiptoeing-tortoise.md | 1 - changelog/fixed/unblocked-nexus-narwhal.md | 1 - changelog/fixed/unflappable-flamingo.md | 1 - changelog/fixed/whistling-wombat.md | 1 - changelog/fixed/wobbling-teacup.md | 1 - changelog/security/mischievous-mongoose.md | 1 - changelog/security/perkier-pamila.md | 1 - changelog/stabilized/serene-salamander.md | 1 - pyproject.toml | 2 +- temporalio/service.py | 2 +- uv.lock | 4 +- 65 files changed, 142 insertions(+), 67 deletions(-) delete mode 100644 changelog/added/boomeranging-bellhop.md delete mode 100644 changelog/added/bouncing-cloudberry.md delete mode 100644 changelog/added/chiming-jellyfish.md delete mode 100644 changelog/added/chuckling-chameleon.md delete mode 100644 changelog/added/dancing-otter.md delete mode 100644 changelog/added/discerning-murlock.md delete mode 100644 changelog/added/leapfrogging-lemur.md delete mode 100644 changelog/added/lignicolous-luisa.md delete mode 100644 changelog/added/patient-puffin.md delete mode 100644 changelog/added/spiraling-sparrow.md delete mode 100644 changelog/added/unhurried-hedgehog.md delete mode 100644 changelog/breaking-changes/bumbling-bumblebee.md delete mode 100644 changelog/breaking-changes/cartwheeling-cupcake.md delete mode 100644 changelog/breaking-changes/sauntering-salamander.md delete mode 100644 changelog/breaking-changes/sleepy-unicorn.md delete mode 100644 changelog/breaking-changes/tap-dancing-turtle.md delete mode 100644 changelog/breaking-changes/vigilant-validator-vole.md delete mode 100644 changelog/breaking-changes/waltzing-walrus.md delete mode 100644 changelog/changed/dancing-marshmallow.md delete mode 100644 changelog/fixed/abstract-albatross.md delete mode 100644 changelog/fixed/bouncing-badger.md delete mode 100644 changelog/fixed/byssoid-ismael.md delete mode 100644 changelog/fixed/cheerful-chinchilla.md delete mode 100644 changelog/fixed/context-free-capybara.md delete mode 100644 changelog/fixed/giggling-teapot.md delete mode 100644 changelog/fixed/impatient-pangolin.md delete mode 100644 changelog/fixed/joining-pathfinder.md delete mode 100644 changelog/fixed/juggling-jellyfish.md delete mode 100644 changelog/fixed/marshmallow-moonwalk.md delete mode 100644 changelog/fixed/moonwalking-muffin.md delete mode 100644 changelog/fixed/nonprocessional-gauge.md delete mode 100644 changelog/fixed/orderly-otter.md delete mode 100644 changelog/fixed/patient-namespace-newt.md delete mode 100644 changelog/fixed/patient-porcupine.md delete mode 100644 changelog/fixed/patient-tortoise.md delete mode 100644 changelog/fixed/perkier-pamila.md delete mode 100644 changelog/fixed/polka-dot-penguin.md delete mode 100644 changelog/fixed/prancing-puffin.md delete mode 100644 changelog/fixed/relay-racing-raccoon.md delete mode 100644 changelog/fixed/rewinding-raccoon.md delete mode 100644 changelog/fixed/rounded-pebble-skipping.md delete mode 100644 changelog/fixed/sheepish-sandbox-otter.md delete mode 100644 changelog/fixed/skipping-squirrel.md delete mode 100644 changelog/fixed/sleepy-lighthouse.md delete mode 100644 changelog/fixed/sleepy-otter-stream.md delete mode 100644 changelog/fixed/snoozing-nexus-otter.md delete mode 100644 changelog/fixed/snoozing-sloth.md delete mode 100644 changelog/fixed/somersaulting-sloth.md delete mode 100644 changelog/fixed/stubborn-nexus-heron.md delete mode 100644 changelog/fixed/talkative-tortoise.md delete mode 100644 changelog/fixed/time-hopping-marmot.md delete mode 100644 changelog/fixed/timeless-tortoise.md delete mode 100644 changelog/fixed/tiptoeing-terrapin.md delete mode 100644 changelog/fixed/tiptoeing-tortoise.md delete mode 100644 changelog/fixed/unblocked-nexus-narwhal.md delete mode 100644 changelog/fixed/unflappable-flamingo.md delete mode 100644 changelog/fixed/whistling-wombat.md delete mode 100644 changelog/fixed/wobbling-teacup.md delete mode 100644 changelog/security/mischievous-mongoose.md delete mode 100644 changelog/security/perkier-pamila.md delete mode 100644 changelog/stabilized/serene-salamander.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 3a7ef493d8..fdab6aee78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,144 @@ This file contains assembled releases only. # Changelog +## [1.35.0] - 2026-10-28 + +### Added + +- Nexus links now convert to and from `Link.Callback` instead of raising `NotImplementedError`. + +- Add an experimental Google Cloud Storage external payload storage driver with an optional async `gcloud-aio-storage` adapter. + +- Add experimental notification service models in `temporalio.nexus.notifications`. The SDK does not currently use these models. + +- Worker now warns when an activity method is registered from the class instead of from an instance (i.e. its first parameter is an unbound `self`). + +- Add experimental `versioning_override` to `workflow.start_child_workflow` and `workflow.execute_child_workflow` to override inherited parent versioning, and `common.OneTimeVersioningOverride` to route an execution to a deployment version until its first completed workflow task. Child overrides require Temporal Server 1.32 or newer; invalid child overrides raise `exceptions.InvalidVersioningOverrideError`. + +- Workers and clients can now read external storage reference payloads that were encoded with the configured payload codec and marked with `__temporal_external_storage_reference` metadata. This release does not write encoded references yet; a later release will, so upgrade all workers before then. + +- `WorkflowEnvironment.start_time_skipping_v2()` starts a Temporal CLI dev server with per-workflow virtual-clock time skipping, the eventual replacement to the global-clock Java test server returned by `start_time_skipping()`. +- `TimeSkipper(client, config=TimeSkippingConfig(...))` from `temporalio.testing` wraps an existing `Client` with per-workflow time skipping for use outside the test environment. + +- Core: Child workflow commands, including those submitted through the C bridge, support pinned, auto-upgrade, and one-time worker deployment versioning overrides on Temporal Server 1.32.0 or later. Child-start resolutions distinguish invalid versioning overrides and missing namespaces from other start failures. + +- Expose `connect_timeout` on `Client.connect` and `ConnectConfig` to bound TCP connection attempts independently of RPC timeouts. The default remains unset. + +- `workflow.new_random()` accepts an optional `name` that is mixed into the seed, so differently named generators, and `workflow.random()`, produce different sequences. + +- Add startup timeout options to `WorkflowEnvironment.start_local` and `WorkflowEnvironment.start_time_skipping` to configure how long to wait for the server to become ready after spawning. + +### Stabilized + +- Removed experimental labels from the core plugin APIs. + +### Changed + +- Payload converters exposed by data converters and workflow/activity accessors retain transfer type conversion, so direct use behaves consistently with SDK serialization. + +### :boom: Breaking Changes + +- `SchedulePolicy.catchup_window` now defaults to `None`. An unspecified window will use the server configured default. + +- **Experimental**: Nexus Workflow Updates now require `wait_for_stage` to be explicitly set to `ACCEPTED`. + +- The Deep Agents, Google ADK, Google GenAI, LangGraph, LangSmith, and Strands Agents integrations have moved to independently versioned packages in [`temporalio/ai-integrations`](https://github.com/temporalio/ai-integrations). The existing SDK extras install the corresponding standalone packages and public `temporalio.contrib` imports forward their APIs; new code should depend on the standalone packages and use their `temporalio.` imports directly. + +- The OpenAI Agents integration has moved to the independently versioned [`temporalio-openai-agents`](https://pypi.org/project/temporalio-openai-agents/) package. The existing `temporalio[openai-agents]` extra now installs that package, and the old public `temporalio.contrib.openai_agents` imports remain available at runtime and retain their static type information. New code should depend on `temporalio-openai-agents` directly and import `temporalio.openai_agents`. + +- `temporalio.contrib.google_adk_agents`: ADK-generated ids and retry jitter now draw from a workflow-private deterministic stream (a `workflow.new_random()` per run) instead of `workflow.random()`. A workflow started under 1.34.0 that generated ADK ids or jitter (for example one waiting on a HITL response) may not replay deterministically across this upgrade; drain such workflows or use worker versioning. + +- Decorating an `async def` function with `@update_method.validator` or passing one as `validator` to `workflow.set_update_handler`/`set_dynamic_update_handler` now raises `ValueError`. Previously the validator was silently never run, so every update was accepted. + +- `temporalio.contrib.opentelemetry`: removed `TemporalIdGenerator.seed_span_id()` and `seed_trace_id()`. + +### Fixed + +- Fix `contrib.opentelemetry` `ReplaySafeLoggerProvider.get_logger()` raising `TypeError` with opentelemetry-api 1.45, where `Logger.enabled` became abstract. `enabled()` now returns `False` while replaying history events, matching `emit()`. + +- `contrib.google_adk_agents`: agents with an `output_schema` no longer fail every workflow task when calling the model. The schema type is now sent to the model activity as its JSON schema. Custom Pydantic schema generation is preserved. Integer-valued output enums are normalized to strings to match Google GenAI. + +- Core: Worker heartbeats now report correct task-slot and poller counts when using buffered or custom metrics backends, including the Python SDK's `MetricBuffer`. Previously these counts could remain `0` because heartbeat accounting depended on reading labels from backend-owned attributes. + +- Decode enums that mix in `str` or `int` (for example `class Color(str, Enum)`) to the enum instead of a list of characters or an error, and decode `dict` keys typed as an `int` enum. + +- System Nexus operations without an operation-specific serialization context no longer give custom payload and failure converters the calling workflow's context. + +- `temporalio.contrib.strands` activity and MCP tools now give the model the Activity's failure message and expose its exception to after-tool hooks. + +- Cancelling a workflow, or the task awaiting `ExternalWorkflowHandle.cancel()`, before the external cancel request resolves no longer fails every following workflow task with `InvalidStateError`. + +- Preserve the result of augmented assignments such as `path /= "child"` in the workflow sandbox, while retaining restrictions on replacement objects. + +- Fixed Pydantic constraints being silently ignored inside or outside workflow sandboxes by passing through `annotated_types` by default. + +- Fix S3 external storage object names by preserving empty namespace segments and using namespace-scoped hash keys when names exceed 1,024 bytes. Document the read and bucket-listing permissions required for uploads. + +- Encoding a datetime search attribute without a timezone now raises `ValueError("Timezone must be present on all search attribute dates")` on the typed path, matching the deprecated untyped encoder, instead of sending a naive ISO string that the server rejects with `BadSearchAttributes`. + +- Core: A workflow task that arrives while a workflow waits on a local activity, such as a legacy query, now waits until the current workflow task is reported. Previously it replaced that workflow task ("Trying to send a new WFT for a run which already has one!"), which then timed out on the server and could leave the workflow stuck on a nondeterminism error. + +- Activity heartbeats are now recorded in the order they were sent. With a payload codec that is slow to encode, an older heartbeat could be recorded after a newer one, so a retried activity resumed from stale heartbeat details. + +- Fix `Worker.shutdown()` and `async with Worker(...)` hanging forever when worker validation fails, for example on a namespace that does not exist. `async with` now raises the validation error. + +- Exiting `async with Worker(...)` now waits for the code that plugins run after the Worker stops in `run_worker`, up to the new `plugin_shutdown_timeout` Worker option, instead of cancelling the task that entered the block. + +- A deserialized `ApplicationError` without a next retry delay now has `next_retry_delay` set to `None` instead of a zero `timedelta`. + +- Core: Workers now replay workflows paused before a scheduled task starts, allowing those workflows to make progress after unpause. + +- `temporalio.contrib.opentelemetry`: `TracingInterceptor` and `OpenTelemetryInterceptor` no longer log `Failed to detach context` when a context is torn down on a different thread while OpenTelemetry's threading instrumentation (enabled by strands, among others) is active; a context is now detached exactly when its token is still valid in the current `contextvars.Context`, which it stays when a workflow resumes on another pool thread. + +- Reject unsupported `InterpreterPoolExecutor` activity executors when creating a worker instead of failing during activity execution. + +- Setting `Worker.client` no longer raises "New client is not on the same runtime as the existing client" when both clients connected without a `runtime`, since both use the default runtime. The check now compares the runtime each client actually connected with. + +- Heartbeating an async activity through a task-token `AsyncActivityHandle` now raises `AsyncActivityCancelledError` with `reset=True` when the activity was reset, as handles created from IDs already did. + +- Keep whole-number `Double` values in typed search attributes returned by `list_workflows()` and other visibility results, instead of silently dropping them. + +- Stop `SandboxImportNotificationPolicy.WARN_ON_UNINTENTIONAL_PASSTHROUGH` and `RAISE_ON_UNINTENTIONAL_PASSTHROUGH` from flagging the module that defines the workflow, which the sandbox reloads on purpose. + +- Experimental Workflow Streams background publishing now retries transient signal delivery failures without delaying payload conversion errors. + +- Workflow wait conditions are no longer evaluated in a workflow task that only delivers updates and rejects all of them. + +- Preserve retained Workflow Stream items after workflow completion, failure, cancellation, termination, or timeout by draining them through read-only queries before subscriptions finish. +- Preserve the original Workflow Streams poll error when the follow-up execution description fails with an RPC error. + +- Prevent pending Nexus operations from logging "Task was destroyed but it is pending!" when a worker stops or evicts a workflow. + +- Cancelling a workflow or local activity while the local activity waits on its retry backoff timer now cancels the timer, instead of failing every workflow task with a `Missing associated machine for LocalActivity` nondeterminism error. + +- `WorkflowStreamClient.subscribe` now propagates task cancellation instead of ending the subscription normally. + +- Fix worker shutdown hanging when a Nexus task is cancelled while its failure is still being encoded. + +- Dropping a client or worker no longer stops log forwarding for the other clients and workers that share its `Runtime`. + +- If enabled, time skipping is applied to workflows started through `Client.start_update_with_start_workflow()` or `Client.execute_update_with_start_workflow()`. + +- `ActivityHandle.describe()` now returns `None` as the `expiration_time` of a Standalone Activity that has no schedule-to-close timeout, instead of a naive `datetime.min`. + +- Send a request ID when terminating a standalone activity, so a retried `ActivityHandle.terminate()` call no longer fails after the first attempt already terminated the activity. + +- Evicting a workflow while an activity or local activity cancellation is still unresolved no longer leaves the eviction retrying forever and worker shutdown hung, a regression in 1.33.0. + +- Fix Nexus worker shutdown hanging forever, and the task slot never being released, when a Nexus handler failure can not be converted or encoded, for example when the payload codec raises or the error details are not serializable. The worker now completes the task with an internal handler error. + +- A cancel that arrives while an activity's result or failure is still being encoded no longer interrupts the reporting, so the completion is still sent. + +- `GoogleAdkPlugin`'s deterministic providers now work in read-only contexts (query handlers, update validators), returning the workflow's deterministic time and fresh entropy without touching the workflow's random state. + +- Decoding a dataclass with `field(init=False)` fields no longer raises `TypeError`; those fields are left out of the constructor call and their serialized values are restored afterwards, including on frozen dataclasses. + +### Security + +- Updated Rust bridge dependencies, including `rustls` to 0.23.45 and `ringbuf` to 0.5.2 to address RUSTSEC-2026-0285 and RUSTSEC-2026-0293. + +- Core: Ephemeral server downloads now use `zip` 9.0 for ZIP extraction, replacing the 8.x dependency [yanked upstream for security issues](https://github.com/zip-rs/zip2/issues/1075#issuecomment-6209381974). + ## [1.34.0] - 2026-09-30 ### Added diff --git a/changelog/added/boomeranging-bellhop.md b/changelog/added/boomeranging-bellhop.md deleted file mode 100644 index ecdaa4c79c..0000000000 --- a/changelog/added/boomeranging-bellhop.md +++ /dev/null @@ -1 +0,0 @@ -Nexus links now convert to and from `Link.Callback` instead of raising `NotImplementedError`. diff --git a/changelog/added/bouncing-cloudberry.md b/changelog/added/bouncing-cloudberry.md deleted file mode 100644 index a0502f3cf5..0000000000 --- a/changelog/added/bouncing-cloudberry.md +++ /dev/null @@ -1 +0,0 @@ -Add an experimental Google Cloud Storage external payload storage driver with an optional async `gcloud-aio-storage` adapter. diff --git a/changelog/added/chiming-jellyfish.md b/changelog/added/chiming-jellyfish.md deleted file mode 100644 index 142285732b..0000000000 --- a/changelog/added/chiming-jellyfish.md +++ /dev/null @@ -1 +0,0 @@ -Add experimental notification service models in `temporalio.nexus.notifications`. The SDK does not currently use these models. diff --git a/changelog/added/chuckling-chameleon.md b/changelog/added/chuckling-chameleon.md deleted file mode 100644 index dece23d5b1..0000000000 --- a/changelog/added/chuckling-chameleon.md +++ /dev/null @@ -1 +0,0 @@ -Worker now warns when an activity method is registered from the class instead of from an instance (i.e. its first parameter is an unbound `self`). diff --git a/changelog/added/dancing-otter.md b/changelog/added/dancing-otter.md deleted file mode 100644 index 0e315afdc9..0000000000 --- a/changelog/added/dancing-otter.md +++ /dev/null @@ -1 +0,0 @@ -Add experimental `versioning_override` to `workflow.start_child_workflow` and `workflow.execute_child_workflow` to override inherited parent versioning, and `common.OneTimeVersioningOverride` to route an execution to a deployment version until its first completed workflow task. Child overrides require Temporal Server 1.32 or newer; invalid child overrides raise `exceptions.InvalidVersioningOverrideError`. diff --git a/changelog/added/discerning-murlock.md b/changelog/added/discerning-murlock.md deleted file mode 100644 index 7e66851aa0..0000000000 --- a/changelog/added/discerning-murlock.md +++ /dev/null @@ -1 +0,0 @@ -Workers and clients can now read external storage reference payloads that were encoded with the configured payload codec and marked with `__temporal_external_storage_reference` metadata. This release does not write encoded references yet; a later release will, so upgrade all workers before then. diff --git a/changelog/added/leapfrogging-lemur.md b/changelog/added/leapfrogging-lemur.md deleted file mode 100644 index 84024e64c9..0000000000 --- a/changelog/added/leapfrogging-lemur.md +++ /dev/null @@ -1,2 +0,0 @@ -`WorkflowEnvironment.start_time_skipping_v2()` starts a Temporal CLI dev server with per-workflow virtual-clock time skipping, the eventual replacement to the global-clock Java test server returned by `start_time_skipping()`. -`TimeSkipper(client, config=TimeSkippingConfig(...))` from `temporalio.testing` wraps an existing `Client` with per-workflow time skipping for use outside the test environment. diff --git a/changelog/added/lignicolous-luisa.md b/changelog/added/lignicolous-luisa.md deleted file mode 100644 index 48ed3f3220..0000000000 --- a/changelog/added/lignicolous-luisa.md +++ /dev/null @@ -1 +0,0 @@ -Core: Child workflow commands, including those submitted through the C bridge, support pinned, auto-upgrade, and one-time worker deployment versioning overrides on Temporal Server 1.32.0 or later. Child-start resolutions distinguish invalid versioning overrides and missing namespaces from other start failures. diff --git a/changelog/added/patient-puffin.md b/changelog/added/patient-puffin.md deleted file mode 100644 index dcd8605473..0000000000 --- a/changelog/added/patient-puffin.md +++ /dev/null @@ -1 +0,0 @@ -Expose `connect_timeout` on `Client.connect` and `ConnectConfig` to bound TCP connection attempts independently of RPC timeouts. The default remains unset. diff --git a/changelog/added/spiraling-sparrow.md b/changelog/added/spiraling-sparrow.md deleted file mode 100644 index 5b08e3a966..0000000000 --- a/changelog/added/spiraling-sparrow.md +++ /dev/null @@ -1 +0,0 @@ -`workflow.new_random()` accepts an optional `name` that is mixed into the seed, so differently named generators, and `workflow.random()`, produce different sequences. diff --git a/changelog/added/unhurried-hedgehog.md b/changelog/added/unhurried-hedgehog.md deleted file mode 100644 index 75835beb44..0000000000 --- a/changelog/added/unhurried-hedgehog.md +++ /dev/null @@ -1 +0,0 @@ -Add startup timeout options to `WorkflowEnvironment.start_local` and `WorkflowEnvironment.start_time_skipping` to configure how long to wait for the server to become ready after spawning. diff --git a/changelog/breaking-changes/bumbling-bumblebee.md b/changelog/breaking-changes/bumbling-bumblebee.md deleted file mode 100644 index 51b917d258..0000000000 --- a/changelog/breaking-changes/bumbling-bumblebee.md +++ /dev/null @@ -1 +0,0 @@ -`SchedulePolicy.catchup_window` now defaults to `None`. An unspecified window will use the server configured default. diff --git a/changelog/breaking-changes/cartwheeling-cupcake.md b/changelog/breaking-changes/cartwheeling-cupcake.md deleted file mode 100644 index 848a500dca..0000000000 --- a/changelog/breaking-changes/cartwheeling-cupcake.md +++ /dev/null @@ -1 +0,0 @@ -**Experimental**: Nexus Workflow Updates now require `wait_for_stage` to be explicitly set to `ACCEPTED`. diff --git a/changelog/breaking-changes/sauntering-salamander.md b/changelog/breaking-changes/sauntering-salamander.md deleted file mode 100644 index 56a89601e1..0000000000 --- a/changelog/breaking-changes/sauntering-salamander.md +++ /dev/null @@ -1 +0,0 @@ -The Deep Agents, Google ADK, Google GenAI, LangGraph, LangSmith, and Strands Agents integrations have moved to independently versioned packages in [`temporalio/ai-integrations`](https://github.com/temporalio/ai-integrations). The existing SDK extras install the corresponding standalone packages and public `temporalio.contrib` imports forward their APIs; new code should depend on the standalone packages and use their `temporalio.` imports directly. diff --git a/changelog/breaking-changes/sleepy-unicorn.md b/changelog/breaking-changes/sleepy-unicorn.md deleted file mode 100644 index 34c66fd792..0000000000 --- a/changelog/breaking-changes/sleepy-unicorn.md +++ /dev/null @@ -1 +0,0 @@ -The OpenAI Agents integration has moved to the independently versioned [`temporalio-openai-agents`](https://pypi.org/project/temporalio-openai-agents/) package. The existing `temporalio[openai-agents]` extra now installs that package, and the old public `temporalio.contrib.openai_agents` imports remain available at runtime and retain their static type information. New code should depend on `temporalio-openai-agents` directly and import `temporalio.openai_agents`. diff --git a/changelog/breaking-changes/tap-dancing-turtle.md b/changelog/breaking-changes/tap-dancing-turtle.md deleted file mode 100644 index 1c398f0d68..0000000000 --- a/changelog/breaking-changes/tap-dancing-turtle.md +++ /dev/null @@ -1 +0,0 @@ -`temporalio.contrib.google_adk_agents`: ADK-generated ids and retry jitter now draw from a workflow-private deterministic stream (a `workflow.new_random()` per run) instead of `workflow.random()`. A workflow started under 1.34.0 that generated ADK ids or jitter (for example one waiting on a HITL response) may not replay deterministically across this upgrade; drain such workflows or use worker versioning. diff --git a/changelog/breaking-changes/vigilant-validator-vole.md b/changelog/breaking-changes/vigilant-validator-vole.md deleted file mode 100644 index f1a9121ff7..0000000000 --- a/changelog/breaking-changes/vigilant-validator-vole.md +++ /dev/null @@ -1 +0,0 @@ -Decorating an `async def` function with `@update_method.validator` or passing one as `validator` to `workflow.set_update_handler`/`set_dynamic_update_handler` now raises `ValueError`. Previously the validator was silently never run, so every update was accepted. diff --git a/changelog/breaking-changes/waltzing-walrus.md b/changelog/breaking-changes/waltzing-walrus.md deleted file mode 100644 index 8927b554c0..0000000000 --- a/changelog/breaking-changes/waltzing-walrus.md +++ /dev/null @@ -1 +0,0 @@ -`temporalio.contrib.opentelemetry`: removed `TemporalIdGenerator.seed_span_id()` and `seed_trace_id()`. diff --git a/changelog/changed/dancing-marshmallow.md b/changelog/changed/dancing-marshmallow.md deleted file mode 100644 index fb8b154773..0000000000 --- a/changelog/changed/dancing-marshmallow.md +++ /dev/null @@ -1 +0,0 @@ -Payload converters exposed by data converters and workflow/activity accessors retain transfer type conversion, so direct use behaves consistently with SDK serialization. diff --git a/changelog/fixed/abstract-albatross.md b/changelog/fixed/abstract-albatross.md deleted file mode 100644 index e0fe3a2c1e..0000000000 --- a/changelog/fixed/abstract-albatross.md +++ /dev/null @@ -1 +0,0 @@ -Fix `contrib.opentelemetry` `ReplaySafeLoggerProvider.get_logger()` raising `TypeError` with opentelemetry-api 1.45, where `Logger.enabled` became abstract. `enabled()` now returns `False` while replaying history events, matching `emit()`. diff --git a/changelog/fixed/bouncing-badger.md b/changelog/fixed/bouncing-badger.md deleted file mode 100644 index c11597ec34..0000000000 --- a/changelog/fixed/bouncing-badger.md +++ /dev/null @@ -1 +0,0 @@ -`contrib.google_adk_agents`: agents with an `output_schema` no longer fail every workflow task when calling the model. The schema type is now sent to the model activity as its JSON schema. Custom Pydantic schema generation is preserved. Integer-valued output enums are normalized to strings to match Google GenAI. diff --git a/changelog/fixed/byssoid-ismael.md b/changelog/fixed/byssoid-ismael.md deleted file mode 100644 index 2f0b69bd39..0000000000 --- a/changelog/fixed/byssoid-ismael.md +++ /dev/null @@ -1 +0,0 @@ -Core: Worker heartbeats now report correct task-slot and poller counts when using buffered or custom metrics backends, including the Python SDK's `MetricBuffer`. Previously these counts could remain `0` because heartbeat accounting depended on reading labels from backend-owned attributes. diff --git a/changelog/fixed/cheerful-chinchilla.md b/changelog/fixed/cheerful-chinchilla.md deleted file mode 100644 index 526958f995..0000000000 --- a/changelog/fixed/cheerful-chinchilla.md +++ /dev/null @@ -1 +0,0 @@ -Decode enums that mix in `str` or `int` (for example `class Color(str, Enum)`) to the enum instead of a list of characters or an error, and decode `dict` keys typed as an `int` enum. diff --git a/changelog/fixed/context-free-capybara.md b/changelog/fixed/context-free-capybara.md deleted file mode 100644 index 4d2f406a9a..0000000000 --- a/changelog/fixed/context-free-capybara.md +++ /dev/null @@ -1 +0,0 @@ -System Nexus operations without an operation-specific serialization context no longer give custom payload and failure converters the calling workflow's context. diff --git a/changelog/fixed/giggling-teapot.md b/changelog/fixed/giggling-teapot.md deleted file mode 100644 index 6e158b35cf..0000000000 --- a/changelog/fixed/giggling-teapot.md +++ /dev/null @@ -1 +0,0 @@ -`temporalio.contrib.strands` activity and MCP tools now give the model the Activity's failure message and expose its exception to after-tool hooks. diff --git a/changelog/fixed/impatient-pangolin.md b/changelog/fixed/impatient-pangolin.md deleted file mode 100644 index 551e000962..0000000000 --- a/changelog/fixed/impatient-pangolin.md +++ /dev/null @@ -1 +0,0 @@ -Cancelling a workflow, or the task awaiting `ExternalWorkflowHandle.cancel()`, before the external cancel request resolves no longer fails every following workflow task with `InvalidStateError`. diff --git a/changelog/fixed/joining-pathfinder.md b/changelog/fixed/joining-pathfinder.md deleted file mode 100644 index ba1580578e..0000000000 --- a/changelog/fixed/joining-pathfinder.md +++ /dev/null @@ -1 +0,0 @@ -Preserve the result of augmented assignments such as `path /= "child"` in the workflow sandbox, while retaining restrictions on replacement objects. diff --git a/changelog/fixed/juggling-jellyfish.md b/changelog/fixed/juggling-jellyfish.md deleted file mode 100644 index d9967563d7..0000000000 --- a/changelog/fixed/juggling-jellyfish.md +++ /dev/null @@ -1 +0,0 @@ -Fixed Pydantic constraints being silently ignored inside or outside workflow sandboxes by passing through `annotated_types` by default. diff --git a/changelog/fixed/marshmallow-moonwalk.md b/changelog/fixed/marshmallow-moonwalk.md deleted file mode 100644 index 5df77df998..0000000000 --- a/changelog/fixed/marshmallow-moonwalk.md +++ /dev/null @@ -1 +0,0 @@ -Fix S3 external storage object names by preserving empty namespace segments and using namespace-scoped hash keys when names exceed 1,024 bytes. Document the read and bucket-listing permissions required for uploads. diff --git a/changelog/fixed/moonwalking-muffin.md b/changelog/fixed/moonwalking-muffin.md deleted file mode 100644 index fa35961270..0000000000 --- a/changelog/fixed/moonwalking-muffin.md +++ /dev/null @@ -1 +0,0 @@ -Encoding a datetime search attribute without a timezone now raises `ValueError("Timezone must be present on all search attribute dates")` on the typed path, matching the deprecated untyped encoder, instead of sending a naive ISO string that the server rejects with `BadSearchAttributes`. diff --git a/changelog/fixed/nonprocessional-gauge.md b/changelog/fixed/nonprocessional-gauge.md deleted file mode 100644 index 2dade0f3d2..0000000000 --- a/changelog/fixed/nonprocessional-gauge.md +++ /dev/null @@ -1 +0,0 @@ -Core: A workflow task that arrives while a workflow waits on a local activity, such as a legacy query, now waits until the current workflow task is reported. Previously it replaced that workflow task ("Trying to send a new WFT for a run which already has one!"), which then timed out on the server and could leave the workflow stuck on a nondeterminism error. diff --git a/changelog/fixed/orderly-otter.md b/changelog/fixed/orderly-otter.md deleted file mode 100644 index 3b7554a1f8..0000000000 --- a/changelog/fixed/orderly-otter.md +++ /dev/null @@ -1 +0,0 @@ -Activity heartbeats are now recorded in the order they were sent. With a payload codec that is slow to encode, an older heartbeat could be recorded after a newer one, so a retried activity resumed from stale heartbeat details. diff --git a/changelog/fixed/patient-namespace-newt.md b/changelog/fixed/patient-namespace-newt.md deleted file mode 100644 index f76c41cfe1..0000000000 --- a/changelog/fixed/patient-namespace-newt.md +++ /dev/null @@ -1 +0,0 @@ -Fix `Worker.shutdown()` and `async with Worker(...)` hanging forever when worker validation fails, for example on a namespace that does not exist. `async with` now raises the validation error. diff --git a/changelog/fixed/patient-porcupine.md b/changelog/fixed/patient-porcupine.md deleted file mode 100644 index 2fa2972c63..0000000000 --- a/changelog/fixed/patient-porcupine.md +++ /dev/null @@ -1 +0,0 @@ -Exiting `async with Worker(...)` now waits for the code that plugins run after the Worker stops in `run_worker`, up to the new `plugin_shutdown_timeout` Worker option, instead of cancelling the task that entered the block. diff --git a/changelog/fixed/patient-tortoise.md b/changelog/fixed/patient-tortoise.md deleted file mode 100644 index cfeee33cdb..0000000000 --- a/changelog/fixed/patient-tortoise.md +++ /dev/null @@ -1 +0,0 @@ -A deserialized `ApplicationError` without a next retry delay now has `next_retry_delay` set to `None` instead of a zero `timedelta`. diff --git a/changelog/fixed/perkier-pamila.md b/changelog/fixed/perkier-pamila.md deleted file mode 100644 index 2bbf2a1b6d..0000000000 --- a/changelog/fixed/perkier-pamila.md +++ /dev/null @@ -1 +0,0 @@ -Core: Workers now replay workflows paused before a scheduled task starts, allowing those workflows to make progress after unpause. diff --git a/changelog/fixed/polka-dot-penguin.md b/changelog/fixed/polka-dot-penguin.md deleted file mode 100644 index c9ae521e1c..0000000000 --- a/changelog/fixed/polka-dot-penguin.md +++ /dev/null @@ -1 +0,0 @@ -`temporalio.contrib.opentelemetry`: `TracingInterceptor` and `OpenTelemetryInterceptor` no longer log `Failed to detach context` when a context is torn down on a different thread while OpenTelemetry's threading instrumentation (enabled by strands, among others) is active; a context is now detached exactly when its token is still valid in the current `contextvars.Context`, which it stays when a workflow resumes on another pool thread. diff --git a/changelog/fixed/prancing-puffin.md b/changelog/fixed/prancing-puffin.md deleted file mode 100644 index d7eeaffe89..0000000000 --- a/changelog/fixed/prancing-puffin.md +++ /dev/null @@ -1 +0,0 @@ -Reject unsupported `InterpreterPoolExecutor` activity executors when creating a worker instead of failing during activity execution. diff --git a/changelog/fixed/relay-racing-raccoon.md b/changelog/fixed/relay-racing-raccoon.md deleted file mode 100644 index d2d84df6b0..0000000000 --- a/changelog/fixed/relay-racing-raccoon.md +++ /dev/null @@ -1 +0,0 @@ -Setting `Worker.client` no longer raises "New client is not on the same runtime as the existing client" when both clients connected without a `runtime`, since both use the default runtime. The check now compares the runtime each client actually connected with. diff --git a/changelog/fixed/rewinding-raccoon.md b/changelog/fixed/rewinding-raccoon.md deleted file mode 100644 index a0c3fade3f..0000000000 --- a/changelog/fixed/rewinding-raccoon.md +++ /dev/null @@ -1 +0,0 @@ -Heartbeating an async activity through a task-token `AsyncActivityHandle` now raises `AsyncActivityCancelledError` with `reset=True` when the activity was reset, as handles created from IDs already did. diff --git a/changelog/fixed/rounded-pebble-skipping.md b/changelog/fixed/rounded-pebble-skipping.md deleted file mode 100644 index f7efc0c9a2..0000000000 --- a/changelog/fixed/rounded-pebble-skipping.md +++ /dev/null @@ -1 +0,0 @@ -Keep whole-number `Double` values in typed search attributes returned by `list_workflows()` and other visibility results, instead of silently dropping them. diff --git a/changelog/fixed/sheepish-sandbox-otter.md b/changelog/fixed/sheepish-sandbox-otter.md deleted file mode 100644 index 998994c60f..0000000000 --- a/changelog/fixed/sheepish-sandbox-otter.md +++ /dev/null @@ -1 +0,0 @@ -Stop `SandboxImportNotificationPolicy.WARN_ON_UNINTENTIONAL_PASSTHROUGH` and `RAISE_ON_UNINTENTIONAL_PASSTHROUGH` from flagging the module that defines the workflow, which the sandbox reloads on purpose. diff --git a/changelog/fixed/skipping-squirrel.md b/changelog/fixed/skipping-squirrel.md deleted file mode 100644 index b1177a41cb..0000000000 --- a/changelog/fixed/skipping-squirrel.md +++ /dev/null @@ -1 +0,0 @@ -Experimental Workflow Streams background publishing now retries transient signal delivery failures without delaying payload conversion errors. diff --git a/changelog/fixed/sleepy-lighthouse.md b/changelog/fixed/sleepy-lighthouse.md deleted file mode 100644 index 6ac2cbc905..0000000000 --- a/changelog/fixed/sleepy-lighthouse.md +++ /dev/null @@ -1 +0,0 @@ -Workflow wait conditions are no longer evaluated in a workflow task that only delivers updates and rejects all of them. diff --git a/changelog/fixed/sleepy-otter-stream.md b/changelog/fixed/sleepy-otter-stream.md deleted file mode 100644 index 82b0957a70..0000000000 --- a/changelog/fixed/sleepy-otter-stream.md +++ /dev/null @@ -1,2 +0,0 @@ -Preserve retained Workflow Stream items after workflow completion, failure, cancellation, termination, or timeout by draining them through read-only queries before subscriptions finish. -Preserve the original Workflow Streams poll error when the follow-up execution description fails with an RPC error. diff --git a/changelog/fixed/snoozing-nexus-otter.md b/changelog/fixed/snoozing-nexus-otter.md deleted file mode 100644 index 46d4b20790..0000000000 --- a/changelog/fixed/snoozing-nexus-otter.md +++ /dev/null @@ -1 +0,0 @@ -Prevent pending Nexus operations from logging "Task was destroyed but it is pending!" when a worker stops or evicts a workflow. diff --git a/changelog/fixed/snoozing-sloth.md b/changelog/fixed/snoozing-sloth.md deleted file mode 100644 index 5bc672cf75..0000000000 --- a/changelog/fixed/snoozing-sloth.md +++ /dev/null @@ -1 +0,0 @@ -Cancelling a workflow or local activity while the local activity waits on its retry backoff timer now cancels the timer, instead of failing every workflow task with a `Missing associated machine for LocalActivity` nondeterminism error. diff --git a/changelog/fixed/somersaulting-sloth.md b/changelog/fixed/somersaulting-sloth.md deleted file mode 100644 index 28d82fb6b1..0000000000 --- a/changelog/fixed/somersaulting-sloth.md +++ /dev/null @@ -1 +0,0 @@ -`WorkflowStreamClient.subscribe` now propagates task cancellation instead of ending the subscription normally. diff --git a/changelog/fixed/stubborn-nexus-heron.md b/changelog/fixed/stubborn-nexus-heron.md deleted file mode 100644 index 175aebfc84..0000000000 --- a/changelog/fixed/stubborn-nexus-heron.md +++ /dev/null @@ -1 +0,0 @@ -Fix worker shutdown hanging when a Nexus task is cancelled while its failure is still being encoded. diff --git a/changelog/fixed/talkative-tortoise.md b/changelog/fixed/talkative-tortoise.md deleted file mode 100644 index 3c7919cc3c..0000000000 --- a/changelog/fixed/talkative-tortoise.md +++ /dev/null @@ -1 +0,0 @@ -Dropping a client or worker no longer stops log forwarding for the other clients and workers that share its `Runtime`. diff --git a/changelog/fixed/time-hopping-marmot.md b/changelog/fixed/time-hopping-marmot.md deleted file mode 100644 index 6df3b3ffa6..0000000000 --- a/changelog/fixed/time-hopping-marmot.md +++ /dev/null @@ -1 +0,0 @@ -If enabled, time skipping is applied to workflows started through `Client.start_update_with_start_workflow()` or `Client.execute_update_with_start_workflow()`. diff --git a/changelog/fixed/timeless-tortoise.md b/changelog/fixed/timeless-tortoise.md deleted file mode 100644 index e29259f3fc..0000000000 --- a/changelog/fixed/timeless-tortoise.md +++ /dev/null @@ -1 +0,0 @@ -`ActivityHandle.describe()` now returns `None` as the `expiration_time` of a Standalone Activity that has no schedule-to-close timeout, instead of a naive `datetime.min`. diff --git a/changelog/fixed/tiptoeing-terrapin.md b/changelog/fixed/tiptoeing-terrapin.md deleted file mode 100644 index 6d5bcc7181..0000000000 --- a/changelog/fixed/tiptoeing-terrapin.md +++ /dev/null @@ -1 +0,0 @@ -Send a request ID when terminating a standalone activity, so a retried `ActivityHandle.terminate()` call no longer fails after the first attempt already terminated the activity. diff --git a/changelog/fixed/tiptoeing-tortoise.md b/changelog/fixed/tiptoeing-tortoise.md deleted file mode 100644 index 55c7a214e2..0000000000 --- a/changelog/fixed/tiptoeing-tortoise.md +++ /dev/null @@ -1 +0,0 @@ -Evicting a workflow while an activity or local activity cancellation is still unresolved no longer leaves the eviction retrying forever and worker shutdown hung, a regression in 1.33.0. diff --git a/changelog/fixed/unblocked-nexus-narwhal.md b/changelog/fixed/unblocked-nexus-narwhal.md deleted file mode 100644 index 142b51c7a1..0000000000 --- a/changelog/fixed/unblocked-nexus-narwhal.md +++ /dev/null @@ -1 +0,0 @@ -Fix Nexus worker shutdown hanging forever, and the task slot never being released, when a Nexus handler failure can not be converted or encoded, for example when the payload codec raises or the error details are not serializable. The worker now completes the task with an internal handler error. diff --git a/changelog/fixed/unflappable-flamingo.md b/changelog/fixed/unflappable-flamingo.md deleted file mode 100644 index 1d297b9a67..0000000000 --- a/changelog/fixed/unflappable-flamingo.md +++ /dev/null @@ -1 +0,0 @@ -A cancel that arrives while an activity's result or failure is still being encoded no longer interrupts the reporting, so the completion is still sent. diff --git a/changelog/fixed/whistling-wombat.md b/changelog/fixed/whistling-wombat.md deleted file mode 100644 index 527e535985..0000000000 --- a/changelog/fixed/whistling-wombat.md +++ /dev/null @@ -1 +0,0 @@ -`GoogleAdkPlugin`'s deterministic providers now work in read-only contexts (query handlers, update validators), returning the workflow's deterministic time and fresh entropy without touching the workflow's random state. diff --git a/changelog/fixed/wobbling-teacup.md b/changelog/fixed/wobbling-teacup.md deleted file mode 100644 index 4249107e89..0000000000 --- a/changelog/fixed/wobbling-teacup.md +++ /dev/null @@ -1 +0,0 @@ -Decoding a dataclass with `field(init=False)` fields no longer raises `TypeError`; those fields are left out of the constructor call and their serialized values are restored afterwards, including on frozen dataclasses. diff --git a/changelog/security/mischievous-mongoose.md b/changelog/security/mischievous-mongoose.md deleted file mode 100644 index 8a75caeea5..0000000000 --- a/changelog/security/mischievous-mongoose.md +++ /dev/null @@ -1 +0,0 @@ -Updated Rust bridge dependencies, including `rustls` to 0.23.45 and `ringbuf` to 0.5.2 to address RUSTSEC-2026-0285 and RUSTSEC-2026-0293. diff --git a/changelog/security/perkier-pamila.md b/changelog/security/perkier-pamila.md deleted file mode 100644 index cb5119b0f3..0000000000 --- a/changelog/security/perkier-pamila.md +++ /dev/null @@ -1 +0,0 @@ -Core: Ephemeral server downloads now use `zip` 9.0 for ZIP extraction, replacing the 8.x dependency [yanked upstream for security issues](https://github.com/zip-rs/zip2/issues/1075#issuecomment-6209381974). diff --git a/changelog/stabilized/serene-salamander.md b/changelog/stabilized/serene-salamander.md deleted file mode 100644 index 7228ad325f..0000000000 --- a/changelog/stabilized/serene-salamander.md +++ /dev/null @@ -1 +0,0 @@ -Removed experimental labels from the core plugin APIs. diff --git a/pyproject.toml b/pyproject.toml index 2de46a242f..3fa5ef724d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "temporalio" -version = "1.34.0" +version = "1.35.0" description = "Temporal.io Python SDK" authors = [{ name = "Temporal Technologies Inc", email = "sdk@temporal.io" }] requires-python = ">=3.10" diff --git a/temporalio/service.py b/temporalio/service.py index 564fb708ad..e20c503286 100644 --- a/temporalio/service.py +++ b/temporalio/service.py @@ -24,7 +24,7 @@ import temporalio.runtime from temporalio.bridge.client import RPCError as BridgeRPCError -__version__ = "1.34.0" +__version__ = "1.35.0" ServiceRequest = TypeVar("ServiceRequest", bound=google.protobuf.message.Message) ServiceResponse = TypeVar("ServiceResponse", bound=google.protobuf.message.Message) diff --git a/uv.lock b/uv.lock index 57a6752505..50eb1daa03 100644 --- a/uv.lock +++ b/uv.lock @@ -11,7 +11,7 @@ resolution-markers = [ ] [options] -exclude-newer = "2026-10-13T17:27:43.175911Z" +exclude-newer = "2026-10-14T19:05:18.734231Z" exclude-newer-span = "P2W" [options.exclude-newer-package] @@ -4980,7 +4980,7 @@ wheels = [ [[package]] name = "temporalio" -version = "1.34.0" +version = "1.35.0" source = { virtual = "." } dependencies = [ { name = "nexus-rpc" },