-
Workers that don't configure poller behavior now auto-enroll in poller autoscaling when the server enables it (
frontend.pollerAutoscalingAutoEnroll); otherwise they keep using a fixed 5-poller maximum. -
Added experimental envconfig extensions. Pass
extensions:toTemporalio::EnvConfig::ClientConfig.load_client_connect_optionsto let separately packaged extensions read their own config fromprofile.<name>.extand environment variables and apply it through client plugins. -
Added experimental Event Groups support:
Workflow.create_event_group,Workflow.with_event_groups, andevent_groups:on workflow command APIs. Signal and update handlers get implicit inbound groups. -
Workflow::Info#original_execution_run_idis the run ID recorded on the workflow execution started event and is preserved across workflow resets. -
Core: A local activity's
ActivityTask.Starthasworkflow_task(field 21), with the started event id, attempt and start time of the workflow task in which Core dispatched it.workflow_taskalso hasprevious_started_event_id,previous_attemptandprevious_started_time, which name the run's last completed workflow task, andfailed_tasks, the started event ids of the run's last 100 failed or timed out workflow tasks. Retries that Core runs locally keep the value. Core leaves it unset for other activities. -
Core: Client environment config profiles include the raw TOML tables under
profile.<name>.ext, keyed by extension name, for SDK envconfig extensions. Strict mode accepts any content underext. The C bridge's profile JSON includes them as anextobject, with TOML datetimes as strings. -
Added
dev_server_startup_timeouttoTemporalio::Testing::WorkflowEnvironment.start_localandtest_server_startup_timeouttoTemporalio::Testing::WorkflowEnvironment.start_time_skippingto control server startup timeout.
- Core: Poller pools now report their poller target to the server on each poll and in the worker heartbeat: the current target for autoscaling pools, the configured maximum for fixed-size pools. (We'll use this count on the server side for now for load balancing pollers between workers, and for creating a per-worker poller count metric.)
- Core: Core now rejects activation responses with a nondeterminism error if the activation contained only updates and the response rejects every update but also includes another workflow command. SDKs must return only update rejections when all validators reject an update-only activation.
-
Core: Ephemeral dev and test servers now complete the automatic port reservation handshake on Linux and macOS before starting, preventing intermittent address-in-use errors during TCP teardown.
-
Core: Resource-based worker tuners now read CPU usage and quotas from standard cgroup v1 mounts. Workers on cgroup v1 systems no longer fall back to host CPU usage and admit work based on understated container load.
-
Core: Preserve queued queries across workflow eviction so requests for the same run are answered instead of silently dropped.
-
Core: Rejection-only update tasks no longer dispatch local activities resumed from replay before validation, allowing those tasks to remain unrecorded in workflow history.
-
Core: Preparing a legacy query now remains in replay mode, preventing unrecorded local activity attempts that could execute twice or leave the workflow stuck.
-
Workflow wait conditions are no longer evaluated for queries, or in a workflow task that only delivers updates and rejects all of them.
-
Time search attribute values now keep sub-second precision, and setting one no longer raises
NoMethodErrorwhen the application has not requiredtime. -
Dev and test server startup now stops waiting at the configured deadline even if a readiness request stalls. Timeout messages include the last connection failure when available.
-
Core: Workers with large workflow caches avoid unnecessary CPU usage when no workflow tasks are waiting for a cache slot.
-
Core: Downloading an ephemeral dev or test server binary now retries transient HTTP failures, such as a
503returned while a release is rolling out, with backoff instead of failing on the first attempt.
- Upgrade Rustls to 0.23.46 to address security vulnerabilities in the native bridge's dependencies.
- Added experimental
versioning_override:toWorkflow.start_child_workflowandWorkflow.execute_child_workflow, includingVersioningOverride::OneTime, to route children independently of their parent on Temporal Server 1.32.0 or later. Rejected overrides raiseError::ChildWorkflowErrorwith anError::InvalidVersioningOverrideErrorcause. - Core: The OTLP metrics exporter can export histograms as OpenTelemetry exponential histograms, which Prometheus-compatible backends store as native histograms, when an SDK enables the option, including through the C bridge. It applies to every histogram, including custom ones, and names each series with a suffix,
_nativeby default, so it never shares a name with the fixed-bucket series it replaces. It cannot be combined with histogram bucket overrides. Explicit buckets remain the default. - Core: The
temporal_activity_execution_failedandtemporal_local_activity_execution_failedworker metrics now carry afailure_reasonattribute. Each is now split into one time series per reason, which may affect existing dashboards. - Core: External workflow signal and cancellation resolution activations now include the typed server failure cause alongside the existing failure.
- Core: Workflow completion-as-cancelled commands can now carry details for recording on the terminal history event.
- Core: Workflow task completions larger than the gRPC request size limit are now paginated automatically when the namespace supports it. Paginated workflow task completions require Temporal Server 1.32.0 or later.
- Priority is no longer marked as experimental.
- The
dev_server_andtest_server_options ofTesting::WorkflowEnvironment.start_localandstart_time_skippingare no longer described as unstable.
Schedule::Policy#catchup_windownow defaults tonil. If unspecified the server configured default is used.- Core: Replay detects changes to the service or operation of scheduled Nexus operations, reporting nondeterminism while retaining compatibility with histories recorded before these checks.
- The test
ActivityEnvironmentno longer addsdetail_hintsto the details it passes toon_heartbeat. - Require
json < 3to prevent JSON payload decoding failures with JSON 3. - Core: Workers now replay workflows paused before a scheduled task starts, allowing those workflows to make progress after unpause.
- Core: Task-poll targets no longer decrease after cancelled or timed-out polls. Affected pollers still retain their slot during backoff, while resource-exhaustion errors still reduce the target.
- Core: Replay now preserves which local activity results were delivered together for newly recorded histories. This prevents local activity scheduling which was conditional on local activity resolution order from assigning recorded results to different handles. Older markers keep their existing behavior.
- Core: Workflow poll balancing now lets non-sticky pollers use capacity after sticky pollers reach their configured or autoscaled polling limit.
- Core: Every path that fails a workflow task now only reports the failure to server on the task's first attempt, and later attempts are left to time out. Previously
PayloadsTooLargefailures and history fetch failures were re-reported on every attempt. - Core: The
workflow_task_execution_failedmetric is now recorded for every failed workflow task attempt, including attempts whose failure was not sent to the server, and itsfailure_reasontag distinguishesGrpcMessageTooLarge,PayloadsTooLarge, andRequestTooLargeon every path. - Core: Worker shutdown now drains activity completions that are still flushing their result to the server before finishing. Previously such a completion β typically one whose final heartbeat RPC was still in flight β could be permanently stranded by shutdown: the activity's result was never reported (the server had to time the attempt out before retrying it), and workers missed shutdown's slot-permit release deadline, panicking in debug builds.
- Core: The Prometheus exporter now appends
_totalto counter metric names when an SDK enables the counter suffix option. - Core: Update-with-start
ExecuteMultiOperationcalls now use Core's long-poll timeout instead of the normal RPC timeout, avoiding premature failures while waiting for an update to reach its requested stage. - Core: An activity failure caused by oversized final heartbeat details is now counted in the
temporal_activity_execution_failedmetric asfailure_reason="PayloadsTooLarge". Previously it was counted under the reason for the failure the activity itself reported, and was not counted at all when that failure was benign, even though a payload-limit failure was reported instead. - Core: Workers now warn when autoscaling task polling encounters errors continuously for one minute. Repeated warnings use exponential backoff up to 15-minute intervals and stop after polling recovers.
- Core: Workers no longer send worker heartbeats or appear in centralized heartbeat reports before they begin polling.
- Core: Nexus tasks are now timed out locally even when the server sends a
request-timeoutheader that falls outside the Nexus duration grammar, such as a negative value for a task whose deadline has already elapsed, a sub-millisecond unit, or a multi-unit value like1m30s. Previously such a header was ignored entirely, so the handler was never told the task had timed out, and a task left unanswered could block worker shutdown indefinitely. - Core: Workers with a small workflow cache no longer briefly stop accepting new workflows. Sticky workflow-task pollers could consume every workflow-cache permit and starve the non-sticky poller, so the worker would stop picking up new workflows until a poll timed out (up to ~60s). The poll balancer now reserves a non-sticky slot against the workflow cache size rather than the slot supplier size.
- 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 remain0because heartbeat accounting depended on reading labels from backend-owned attributes. - Core: Local activities still running when their workflow is evicted or the worker shuts down now always receive a cancellation. Local activities no longer retry ordinary failures or start-to-close timeouts after cancellation has been requested, matching non-local activities. Workflow code no longer observes a spurious local activity cancellation when its run is evicted or completes while the local activity is backing off between retries.
- Core: Workers no longer panic when evicting a workflow with buffered local activity results. Completed activations' output is recorded before eviction, without recording eviction-induced cancellations.
- 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.
- Core: Ephemeral server downloads now use
zip9.0 for ZIP extraction, replacing the 8.x dependency yanked upstream for security issues.
- Standalone Activities are now generally available (GA). (Standalone Activities as Nexus operations
and Standalone Activities operator commands remain experimental. Operator commands are
pause,unpause,updateOptions,restoreOriginal.)
- Duplicate keys in
update_optionsare now an error. - Renamed the standalone activity
static_summary:option onClient#start_activityandClient#execute_activitytosummary:, andClient::ActivityExecution::Description#static_summaryto#summary.
Client::ActivityHandlenow supports operator commands for standalone activities:#pause,#unpauseand#update_options.- Added opt-in payload fields to
Client::ActivityHandle#describe:include_input:,include_outcome:,include_heartbeat_details:andinclude_last_failure:, all defaultfalse. - Add missing description fields:
execution_time,start_delay,total_heartbeat_count.
Descriptionpayload fields are now opt-in:input,outcome,heartbeat_details,last_failure.
- Canceling a fiber-executor activity no longer wedges the worker if using a
Fiber#transferbased scheduler (such asasync). The exception is now delivered through the scheduler'sfiber_interrupthook when it provides one.
-
Added
Temporalio::Runtime::LoggingOptions#log_formatto select compact, pretty, or newline-delimited JSON output for Core logs written to the console. -
Added
FailureConverterprocess_common_attributes:to customize the value sent to the payload converter when encoding common failure attributes. -
Added the
Temporalio::Workermax_eager_activity_reservations_per_workflow_task:option to configure the number of activity slots reserved for eager execution per workflow task. Values must be positive; usedisable_eager_activity_execution: trueto disable eager execution.
- By default, workers now proactively validate outbound payload/memo sizes before sending: a field
over the warn threshold is logged
(
[TMPRL1103]atWARN) but still sent, while a task completion over the error limit is failed retryably ([TMPRL1103]atERROR) instead of sent. Previously these reached the server, which terminated the workflow or failed the activity non-retryably; failing retryably instead lets a corrected workflow or activity be redeployed and recover. Tune warn thresholds viaTemporalio::Client::Connection::PayloadLimitsOptions(passed as the connection'spayload_limits:). If you use a proxy between the worker and server that alters the size of payloads (e.g. compression, encryption, external storage), it is advised that you disable size enforcement by settingdisable_payload_error_limit: trueon the worker.
- User metadata fields (static_summary, static_details, current_details, activity summary, timer summary) are no longer marked as experimental.
Temporalio::Client::WorkflowHandle#resultnow preserves fiber-localThread.current[]context while fetching workflow history, allowing gRPC interceptors to apply request-scoped RPC options.Temporalio::Client::WorkflowHandle#resultno longer returnsnilwhile a workflow is still running when a history long poll expires without returning an event.
- Worker heartbeats now report the SDK runtime and hosting/platform information the first time each
worker heartbeats successfully. Set
Temporalio::Runtime.new(disable_environment_info: true)to opt out of environment reporting entirely.
- Bumped bundled sdk-core to 0.6.0.Bump sdk-core to 8cf682b7 (0.6.0). Changes in temporalio/ext/src/client.rs, envconfig.rs, worker.rs to use .builder().
- Exposed
Temporalio::Workflow::ContinueAsNewError#backoff_start_interval, to allow the new workflow to start after a delay. - Added the experimental
Temporalio::Workerpatch_activation_callback:option, allowing workers to decide whether a first non-replayTemporalio::Workflow.patchedcall should activate a patch during rolling deployments.
The native extension can now be built with TEMPORALIO_FIPS=1 to use the FIPS-mode
aws-lc-rs TLS backend for gRPC and OTLP metrics. This is opt-in, source-build only.
FIPS builds use SHA-256 rather than MD5 for the default worker build ID and warn when
the Ruby OpenSSL runtime is not itself in FIPS mode.
Released gems now contain the SDK's maintained RBS signatures in sig/ and Sorbet RBI
signatures in rbi/, including generated types for Temporal API messages and services.
These type signatures are subject to change in future releases as we move towards a stronger typing story.
Client connections now use gzip transport compression by default. Pass
grpc_compression: Temporalio::Client::Connection::GrpcCompressionOptions::None.new to
Client.connect or Client::Connection.new to opt out.
Workflow activations containing continue-as-new suggestion reasons previously failed because the
worker tried to call to_i on bridge enum symbols. Continue-as-new suggestion reasons are now
converted from bridge enum symbols to Temporalio::SuggestContinueAsNewReason integer enum values before being exposed to workflows.
A workflow deadlock raised inside Temporalio::Workflow::Future is no longer deferred until the
future is awaited. The worker fails the current workflow task immediately, preventing commands
created before the deadlock from being recorded as a successful partial command batch.
The workflow scheduler no longer yields while a workflow fiber is blocked on the
google-protobuf object-cache mutex. This prevents a workflow task from completing with only part
of a command batch when Protobuf serialization blocks.
Fixed a race in replay_workflow where if a NDE was hit, worker shutdown could panic if it happens before async activation completion completes.
- Retried transport-originated gRPC
CANCELLEDerrors, such as a connection closure or GOAWAY, using the normal RPC retry policy while continuing not to retry application-initiated cancellations. - Resource sampling interval for worker heartbeating now matches heartbeat interval rather than every 100ms
- Activities with a heartbeat timeout shorter than their start-to-close timeout now still enforce the start-to-close timeout while heartbeats succeed.
- Local activity completion after workflow eviction no longer risks a Core panic or dispatching a stale local activity.
- Corrected the
worker_task_slots_usedgauge so it does not count a slot that is currently being released. - OTLP metric export failures are now emitted through Core telemetry, making them visible through the SDK logger.
With the introduction of Standalone Activities (see below), an activity is no longer guaranteed to
have been scheduled by a workflow. Activity::Info#workflow_id, #workflow_run_id,
#workflow_type, and #workflow_namespace are now nullable β they return nil when the activity
was started via Client#start_activity rather than from a workflow. A new Activity::Info#namespace
accessor is always set (falling back to the client's namespace for standalone activities) and is
the recommended replacement for the deprecated #workflow_namespace.
Existing workflow-only code paths are unaffected at runtime. The recommended migration is to call
Activity::Info#in_workflow? and branch on the result.
Activities can now be started directly from a client, independently of any workflow. Client#start_activity
and Client#execute_activity schedule a standalone activity execution by ID and task queue, accepting the
same Activity::Definition classes (or by-name strings/symbols) used in workflow-scheduled activities.
Client::ActivityHandle provides #result, #describe, #cancel, and #terminate; Client#list_activities
and Client#count_activities provide visibility-backed queries; and Client#async_activity_handle now
accepts a standalone-form ActivityIDReference (constructed via ActivityIDReference.for_standalone) for
async completion.
See https://docs.temporal.io/standalone-activity for the cross-SDK feature overview.
When a workflow_update_validator rejected an update sent via
Client#execute_update_with_start_workflow (or #start_update_with_start_workflow with
wait_for_stage: COMPLETED), the client polled history for an outcome that was never written
and surfaced the failure as Temporalio::Error::RPCError with code NOT_FOUND. The caller now
correctly receives Temporalio::Error::WorkflowUpdateFailedError. (#454)
Client#start_activity and Client#execute_activity now accept a start_delay: kwarg. When set, the server creates the activity immediately,
but defers dispatch to a worker until the delay elapses. Retry attempts do not re-apply the delay.
ScheduleToStart and ScheduleToClose timeout clocks begin counting after the delay
elapses; StartToClose and Heartbeat are unaffected. Currently experimental.