Notable Changes
💥 Breaking Changes
- Removed the unused
NexusHandlerFailureException; Nexus handler failures are represented by
NexusRpc.Handlers.HandlerException. The SDK-createdTemporalNexusClientimplementation is now
internal; Nexus operation handlers continue to receive its publicITemporalNexusClient
interface. - By default, workers now proactively validate outbound payload/memo sizes before sending: a field
over the warn threshold is logged ([TMPRL1103]at
WARN) 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 via
TemporalConnectionOptions.PayloadLimits. 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 settingDisablePayloadErrorLimittotrueon the worker. - Activity failures now include the latest heartbeat details atomically instead of force-flushing a throttled heartbeat first. Temporal Server 1.16.0 or newer is required to guarantee those details are preserved on failure; workers warn when the server does not advertise support.
Added
- Added experimental SDK payload converter support for values and target types that expose
Temporal transfer type conversion hooks. This lets hook-aware types delegate
their wire representation to the configured payload converter, preserving SDK
behavior such as serialization contexts. - Added
TemporalWorkerOptions.MaxEagerActivityReservationsPerWorkflowTaskto configure the
maximum number of activity slots reserved for eager execution per workflow task. Configured
values must be positive; useDisableEagerActivityExecutionto disable eager execution. - Added
WorkflowEnvironment.CreateFromEnvConfigAsyncfor creating test workflow environments from
client environment configuration. - Added the experimental
TemporalWorkerOptions.PatchActivationCallback, allowing workers to
decide whether a first non-replayWorkflow.Patchedcall should activate a patch during rolling
deployments. - Support standalone activities as Nexus operations.
ITemporalNexusClient.StartActivityAsync
backs a Nexus operation with a standalone activity (async only). Cancellation of
activity-execution operations can be customized by overriding
TemporalOperationHandler<TInput, TResult>.CancelActivityExecutionAsync. - Worker heartbeats now report the hosting .NET runtime and its version. Set the new
TemporalRuntimeOptions.DisableEnvironmentInfoto omit all runtime, hosting, and platform
information from heartbeats. - Workers are now automatically enrolled into poller autoscaling when the namespace advertises the
poller_autoscaling_auto_enrollcapability. This only applies to poller types left at their
default (the worker set neither a fixed poller count nor a poller behavior); explicitly
configured pollers are left unchanged. - Workers now log a [TMPRL1104] warning when a workflow task takes longer than 5 seconds. Set
TEMPORAL_WORKFLOW_TASK_DURATION_WARN_SECONDSto change the threshold.
Changed
- Nexus support for calling operations from workflows and handling workflow-backed operations with
WorkflowRunOperationHandleris now generally available (GA). Standalone Nexus Operation andTemporalOperationHandler,
including workflow updates and standalone activities as Nexus operations, remains experimental. - User metadata fields (StaticSummary, StaticDetails, CurrentDetails, Activity Summary, Timer
Summary) are no longer marked as experimental. - Hardened read-only workflow context enforcement so queries, update validators, and patch activation
callbacks cannot mutate handlers or workflow details, invoke patches, or schedule workflow work.
Patch activation callbacks also cannot use workflow randomness or issue workflow commands. - A
NexusRpc.Handlers.HandlerExceptionthrown by a payload codec or payload converter while
decoding Nexus operation input is now propagated as-is instead of being wrapped in anInternal
(codec) orBadRequest(converter) handler exception. This matches the existing pass-through
behavior forApplicationFailureExceptionand lets codecs and converters control the resulting
Nexus error type and retry behavior.
Fixed
- Workers no longer advertise a worker control task queue unless the namespace supports worker
heartbeats and commands and the built-in Nexus command worker is running. - Local activity resolutions are now delivered to workflows as each activity completes instead of waiting for every local activity in the workflow task. This allows sequences of short local activities to make progress while a long-running local activity executes in parallel, while preserving the resolution ordering recorded in existing histories during replay.
- Try-cancel child workflows no longer cause nondeterminism when they complete or fail after their cancellation was requested.
What's Changed
- chore: update baseline to 1.17.0 by @jmaeagle99 in #785
- Add Nexus Otel tracing instructions by @Quinn-With-Two-Ns in #793
- docs: update contributing guide by @tconley1428 in #786
- Add patch activation callback by @Sushisource in #782
- fix: checkout global.json for nuget-publish by @jmaeagle99 in #790
- fix(test): deflake ExecuteWorkflowAsync_HistoryInfo_IsAccurate by @jmaeagle99 in #792
- Remove experimental markers from user metadata fields by @laniehei in #796
- Add changelog CI gate workflow by @laniehei in #797
- Support Workflow Update as a Nexus Operation by @Evanthx in #783
- 💥 feature: payloads/memo size validation by @jmaeagle99 in #787
- Add Standalone Activities support to Temporal Nexus Operation Handler by @Quinn-With-Two-Ns in #748
- feat(testing): support envconfig in integration test harness by @THardy98 in #794
- Expose eager activity reservation limit by @Sushisource in #798
- build(deps): bump jdx/mise-action from 4.2.0 to 4.2.1 by @dependabot[bot] in #805
- build(deps): bump actions/checkout from 7.0.0 to 7.0.1 by @dependabot[bot] in #806
- build(deps): bump actions/setup-dotnet from 5.4.0 to 6.0.0 by @dependabot[bot] in #807
- Bump Microsoft.NET.Test.Sdk from 17.4.1 to 18.8.1 by @dependabot[bot] in #809
- Updating Temporal API protos by @Evanthx in #812
- Bump System.CommandLine from 2.0.8 to 2.0.10 by @dependabot[bot] in #811
- chore: pin tool versions and add mise tasks by @jmaeagle99 in #814
- build(deps): bump jdx/mise-action from 4.2.1 to 4.2.3 by @dependabot[bot] in #815
- fix: workaround dotnet tool install rid package issue by @jmaeagle99 in #817
- ci: extract shared build setup into a composite action by @jmaeagle99 in #818
- build(deps): bump actions/setup-dotnet from 5.2.0 to 6.0.0 in /.github/actions/smoke-test by @dependabot[bot] in #819
- 💥 Mark Nexus Support as GA by @Quinn-With-Two-Ns in #813
- Add NexusOperationHandler annotation by @Quinn-With-Two-Ns in #764
- Add transfer type payload conversion hooks by @tconley1428 in #795
- docs: clarify AI contribution expectations by @tconley1428 in #821
- Pass through Nexus handler exceptions in payload serializer by @bergundy in #829
- chore: update sdk-core submodule to latest by @jmaeagle99 in #824
- feat: report .NET runtime in heartbeats with opt-out option by @jmaeagle99 in #826
- chore: update sdk version to 1.18.0 by @jmaeagle99 in #828
- fix(ci): pin .NET 10 alpine image by @jmaeagle99 in #832
SDK Core Update
Updated from temporalio/sdk-rust@95e9768 to temporalio/sdk-rust@78ac17e
- Fix workflow executor cooperative budget livelock in temporalio/sdk-rust#1396
- docs: update contributing guide in temporalio/sdk-rust#1397
- chore: add dev tools to mise.toml, remove redundant CI installs in temporalio/sdk-rust#1386
- Fix task slots used metric in temporalio/sdk-rust#1391
- feat(sdk): remove remaining raw protos in APIs in temporalio/sdk-rust#1398
- feat(sdk): provide typed accessor for workflow count group in temporalio/sdk-rust#1410
- Allow resource controllers to be shared across tuners in temporalio/sdk-rust#1407
- 💥 feat: payload limit enforcement in temporalio/sdk-rust#1363
- chore: extract composite action for CI setup, add selective mise installs in temporalio/sdk-rust#1387
- chore(ci): use github backend for temporal cli in temporalio/sdk-rust#1414
- Add patch activation callback in temporalio/sdk-rust#1394
- Replace unmaintained backoff crate with backon in temporalio/sdk-rust#1411
- Only set worker control task queue field in polls when appropriate in temporalio/sdk-rust#1418
- feat(sdk): add
randomanduuid4in workflow context in temporalio/sdk-rust#1412 - fix(sdk): respect forced failure over completion in same poll in temporalio/sdk-rust#1417
- chore(sdk): rename start_activity to execute_activity in temporalio/sdk-rust#1416
- don't use versioning for internal nexus poller in temporalio/sdk-rust#1420
- Integrate Temporal API 1.63.4 in temporalio/sdk-rust#1423
- Make eager activity reservation limit configurable in temporalio/sdk-rust#1424
- feat(sdk): auto-enroll default pollers into autoscaling in temporalio/sdk-rust#1425
- Gate ResourceBasedTuner on anonymous memory instead of cgroup memory.current in temporalio/sdk-rust#1409
- Add
connect_timeoutoption toConnectionOptionsin temporalio/sdk-rust#1422 - feat(sdk): client interceptor in temporalio/sdk-rust#1426
- fix(sdk): make payload codec failable in temporalio/sdk-rust#1431
- feat(sdk): workflow interceptors in temporalio/sdk-rust#1401
- Flake fix investigation in temporalio/sdk-rust#1430
- feat(sdk): reexport core runtime from sdk in temporalio/sdk-rust#1437
- Updating Temporal API Protos in temporalio/sdk-rust#1441
- chore(sdk): release 0.6.0 in temporalio/sdk-rust#1447
- fix(sdk): CancelledFuture is no longer generic in temporalio/sdk-rust#1449
- Allow LAs to wake up workflow while another is still executing in temporalio/sdk-rust#1442
- chore(sdk): mark remaining
Optionstypes asnon_exhaustivein temporalio/sdk-rust#1450 - Fix NDEs when try-cancel children complete/fail after being cancelled in temporalio/sdk-rust#1455
- Add eager dispatch test for activity cancel via worker commands in temporalio/sdk-rust#1435
- feat(sdk): Add plugins in temporalio/sdk-rust#1436
- feat(sdk): add cancellation token in temporalio/sdk-rust#1451
- 💥 Use heartbeat details field on activity failure instead of force-flush in temporalio/sdk-rust#1456
- build(deps): bump hoverkraft-tech/compose-action from 2.5.0 to 2.6.0 in temporalio/sdk-rust#1284
- build(deps): bump actions/upload-artifact from 7.0.0 to 7.0.1 in temporalio/sdk-rust#1283
- Support dynamic client certificate resolution (ResolvesClientCert) in temporalio/sdk-rust#1340
- fix(sdk): reject updates when validators panic in temporalio/sdk-rust#1462
- Collect information about runtime environment in temporalio/sdk-rust#1457
- feat(core): emit workflow task duration logging in temporalio/sdk-rust#1433
- Add forward declarations to C bridge header to fix -Wvisibility warnings in temporalio/sdk-rust#1467
- docs: clarify AI contribution expectations in temporalio/sdk-rust#1472
- Properly pass the selected TLS implementation to reqwest in temporalio/sdk-rust#1458
- Use typed worker run errors in temporalio/sdk-rust#1459
- fix(core): delay zero-cache eviction until LA resolutions drain in temporalio/sdk-rust#1482
- docs: split sdk-core change log from the Rust SDK change log in temporalio/sdk-rust#1484
New Contributors
Full Changelog: 1.17.0...1.18.0