Releases: temporalio/sdk-go
v1.44.0
(Experimental) Stand Alone Nexus Operations
NOTE: Stand Alone Nexus Operation Support is experimental and currently only supported on pre-release versions of the [dev server](https://github.com/temporalio/cli/releases/tag/v1.7.1-standalone-nexus-operations).
Added support for Stand Alone Nexus Operations, allowing clients to
start and manage Nexus operations directly outside of a Workflow. Operations can be tracked through a NexusOperationHandle that supports getting results, describing, cancelling, and terminating executions. The client also exposes ListNexusOperations,
CountNexusOperations, and GetNexusOperationHandle for discovering
and reattaching to running operations.
Documentation, Samples, and instructions to request enablement in Temporal Cloud will be linked here when available.
SDK Flag SDKFlagMemoUserDCEncode has been enabled by default
Memo's previously didn't use the user data converter, now the SDK will first use the user data converter, and if user DC errors out, the default DC will be used as a fallback. If that also returns an error, the user DC error will be returned to the caller.
Note that old histories before this flag was flipped on will continue to use the old code path of not using the user DC.
What's Changed
- Bump go-m1cpu to v0.2.1 to fix SIGSEGV on Apple M5 by @dplyukhin in #2327
- Set time to 10 minutes not 60 seconds by @yuandrew in #2321
- Remove dead links by @yuandrew in #2322
- Enable SDKFlagMemoUserDCEncode flag by default by @yuandrew in #2332
- Add missing Describe() method to external storage s3driver docs by @Ozoniuss in #2338
- feat: expose
ExecuteNexusOperationParamsfor external SDKs by @xepozz in #2309 - Fix Worker Deployment test flakes by @yuandrew in #2333
- Document default for ChildWorkflowOptions.WorkflowIDReusePolicy by @yuandrew in #2339
- fix(logs): change WFT duration to trace level by @jmaeagle99 in #2347
- Remove vendored ExternalStorageReference, use go.temporal.io/api v1.62.12 by @denniszag in #2343
- remove stale nightly tps omes test by @THardy98 in #2351
- Add support for Stand Alone Nexus Operations by @Quinn-With-Two-Ns in #2280
- Add banner like other SDKs have by @Sushisource in #2348
- Fix unsupported link log by @Quinn-With-Two-Ns in #2354
- VLN-1344: remediate missing-dependency-cooldown by @picatz in #2346
- Add doc comments to new struct fields for serialization context by @yuandrew in #2324
New Contributors
- @dplyukhin made their first contribution in #2327
- @xepozz made their first contribution in #2309
- @denniszag made their first contribution in #2343
Full Changelog: v1.43.0...v1.44.0
v1.43.1
Fixed ExternalStorageReference API vendoring panic
This patch fixes a panic that users hit when using the latest go.temporal.io/api v1.62.12 dependency with Go SDK v1.43.0
What's Changed
Full Changelog: v1.43.0...v1.43.1
v1.43.0
Highlights
💥 Payload and Memo Size Validation (Experimental)
Within workers, if a payload exceeds the server limits, the worker will eagerly fail the current task instead of uploading the object with the too large payload or memo. This allows the task to be retried instead of entirely failing the workflow from within the server. Additional documentation on how to use this feature will be linked here when available.
External Storage Updates (Experimental)
- Store and retrieval operations run concurrently with a default limit of 3 concurrent sequence visits per workflow task, thus shortening wall-class time for store and retrieval operations for each workflow task.
- New Codec Server payload HTTP handler to allow Temporal Web UI and CLI to encode, decode, and download externally stored payloads. Additional documentation on how to use this feature will be linked here when available.
- 💥 External storage event history format has been incompatibly changed from prerelease. New storage references are emitted in the new format starting with release. Support for the ability to retrieve references in the old format has been preserved. The prerelease format is deprecated and will be removed in a future release.
What's Changed
- S3 driver readmes by @jmaeagle99 in #2281
- Clarify Standalone Activities in S3 driver README by @drewhoskins-temporal in #2287
- Remove flag for cancelling worker polls on shutdown by @jmaeagle99 in #2288
- Expose Nexus Endpoint in Nexus Info by @Quinn-With-Two-Ns in #2291
- Enable external storage concurrency by @jmaeagle99 in #2294
- chore: Update and pin all GHA actions by @mjameswh in #2297
- Internal: fix already-ready future chaining to properly complete dest… by @kritibehl in #2298
- 💥 Experimental: Payload limit validation by @jmaeagle99 in #2255
- Do not require resource tuner for heartbeat CPU/mem metrics by @Sushisource in #2301
- More TMPRL1104 logging details by @jmaeagle99 in #2300
- fix: pollerBalancer.balance checks own count deterministically on every iteration by @brucearctor in #2250
- Experimental: Payload HTTP Handler for Codecs and External Storage by @jmaeagle99 in #2295
- 💥 Experimental: Memo limit validation by @jmaeagle99 in #2303
- docs(contributing): remove outdated info from CONTRIBUTING.md. by @cconstable in #2306
- Add main branch to GitHub workflows by @jmaeagle99 in #2308
- Payload visit activity heartbeat by @jmaeagle99 in #2312
- SEC-1653: remediate missing-govulncheck-workflow by @picatz in #2313
- 💥 Use ExternalStorageReference protobuf message for payload references by @jmaeagle99 in #2311
- Update go.temporal.io/api to 1.62.11 by @jmaeagle99 in #2310
- Update go.opentelemetry.io/otel to 1.41.0 by @jmaeagle99 in #2317
- Use protojson marshaling for payload HTTP handler response by @jmaeagle99 in #2315
- Add Describe to S3 driver client by @jmaeagle99 in #2316
- Set task poller type for scalable task pollers by @kritibehl in #2248
- Add
CONTINUE_AS_NEW_VERSIONING_BEHAVIOR_USE_RAMPING_VERSIONby @THardy98 in #2319
New Contributors
- @drewhoskins-temporal made their first contribution in #2287
- @brucearctor made their first contribution in #2250
- @cconstable made their first contribution in #2306
Full Changelog: v1.42.0...v1.43.0
v1.42.0
Breaking Changes
💥 Minimum Go version updated to 1.24.0
The minimum Go version for the Go SDK has been updated 1.24.0 due to required dependency updates having this Go version.
💥 Namespace fields for cross-namespace workflow commands are deprecated
As of server 1.30.1, cross-namespace operations are disabled by default. The SDK has been updated to deprecate the corresponding fields and functions:
ChildWorkflowOptions.Namespacefield is deprecatedworkflow.WithWorkflowNamespacefunc is deprecated
Highlights
Serverless Lambda Workers (Pre-Release)
This release introduces a module which can be used together with upcoming changes to the Temporal server & cloud which allow you to run your worker in an AWS Lambda function which the server will invoke as-needed to process Workflow, Activity, and Nexus tasks - allowing you to do away with some of the operational burden of running a fleet of workers. Additional documentation on how to use this feature will be linked here when available.
AWS S3 Storage Driver (Pre-Release)
This release introduces a module which can be used with external storage to offload large payloads to S3 buckets in AWS instead of inlining them into workflow history. Additional documentation on how to use this feature will be linked here when available.
Serialization Context for Codecs and Converters
This release introduces SerializationContext — an opt-in mechanism that provides metadata (e.g. namespace, workflow ID, activity type, etc...) to DataConverter, PayloadCodec, and FailureConverter implementations during serialization/deserialization.
Bug Fixes
- Fix standalone activity header propagation so interceptors can access and modify headers.
What's Changed
- Fix memory logger to share lock with derived loggers by @jmaeagle99 in #2237
- Allow poller scale-down on timeout when server supports autoscaling by @Sushisource in #2239
- Experimental: External Storage by @jmaeagle99 in #2224
- No longer cancel pending polls on shutdown by @yuandrew in #2199
- Report driver types through worker heartbeat by @jmaeagle99 in #2246
- Delete some prominent but unimportant log messages by @dandavison in #2247
- Fix test flakes by @yuandrew in #2253
- Add Serialization context for codecs and converters by @yuandrew in #2225
- Fix SAA header propagation by @Quinn-With-Two-Ns in #2256
- Experimental: AWS S3 storage driver by @jmaeagle99 in #2257
- Serverless Lambda support by @Sushisource in #2245
- Fix nonexistent version in lambda otel go mod by @Sushisource in #2262
- Upgrade grpc to v1.79.3 by @yuandrew in #2263
- Fix - provide default (empty) client config when default user config dir does not exist by @THardy98 in #2266
- 💥 Update Temporal API to 1.62.7 by @jmaeagle99 in #2267
- Update storage driver store context by @jmaeagle99 in #2268
- Update version to 1.42.0 by @jmaeagle99 in #2278
- Bump github.com/aws/aws-sdk-go-v2/service/s3 from 1.79.3 to 1.97.3 in /contrib/aws/s3driver/awssdkv2 by @dependabot[bot] in #2276
New Contributors
- @jmaeagle99 made their first contribution in #2237
Full Changelog: v1.41.1...v1.42.0
v1.41.1
Bugfixes
Fixed a permanent NDE on replay when Data Converter or Codec fails on Session activity cancellation. Refer to #2228 for more details.
Also fixed an issue with worker heartbeat ctx not being propagated for cancellation on worker shutdown. More details #2215
What's Changed
- Worker heartbeat ctx cancel fix by @yuandrew in #2215
- separate out CI into more jobs, remove coverage upload by @yuandrew in #2220
- Docs improvements by @yuandrew in #2214
- Fix OnWorkflow mock to see propagated context headers by @kritibehl in #2212
- Upgrade go.opentelemetry.io/otel/sdk to v1.40.0 by @yuandrew in #2227
- Fix NDE due to task failure in sessions + cancellation by @Sushisource in #2228
Full Changelog: v1.41.0...v1.41.1
v1.41.0
Breaking Changes
💥 Worker Heartbeats
This release adds a new feature called Worker Heartbeating. This feature spins up a single nexus-only worker per Client/Namespace in the background and periodically sends some basic metrics over to server for all of the workers registered on the same Client/Namespace.
Server version 1.29.1 and newer supports this feature. This feature will be enabled by default, although this currently requires a server dynamic config flag, --dynamic-config-value frontend.WorkerHeartbeatsEnabled=true to enable. Currently, the only way to interact with this new data is to also enable the flag --dynamic-config-value frontend.ListWorkersEnabled=true, then use CLI commands temporal worker list and temporal worker describe to query the data. If heartbeating is enabled with a server version older or with the config flag off, a single warning log Worker heartbeating configured for runtime, but server version does not support it. on worker startup will emit.
💥 With the introduction of Worker Heartbeats, we’ve deprecated the contrib/resourcetuner lib, and instead created a new contrib/sysinfo lib. The resource tuner now lives in the worker package.
💥 Nexus Error Serialization Improvements
Note: Requires Temporal Server version 1.31.0 or later.
This release of the Go SDK includes a number of enhancements to error serialization for synchronous operations.
nexus.HandlerErrorcan now include its own message (and stack trace if the language supports it) independent from thecausenexus.OperationErrorcan now include its own message (and stack trace if the language supports it) independent from thecause- 💥
nexus.OperationErroris now included in the error chain when a synchronous operation handler returns anexus.OperationError. Thenexus.OperationErrorwill be translated to an appropriate Temporal error based on the state of the error. Previously this error was not included in the error chain.OperationStateFailedwill be translated to anApplicationErrorOperationStateCancelledwill be translated to anCanceledError
These changes only effect synchronous operations. There is no change to errors for asynchronous operations like starting a workflow.
Highlights
Nexus Operation Timeouts
Note: Requires Temporal Server version 1.31.0 or later.
This release of the Go SDK adds more timeout options on NexusOperationOptions to control how long the caller wants to wait on different stages of the operation.
Schedule-to-Start timeout
The Schedule-to-Start timeout limits how long the caller will wait for the Operation to be started by the handler.
If not set, no Schedule-to-Start timeout is enforced.
fut := c.ExecuteOperation(ctx, service.HelloOperationName, service.HelloInput{Name: name, Language: language}, workflow.NexusOperationOptions{
ScheduleToStartTimeout: 2 * time.Minute,
})Start-to-Close timeout
The Start-to-Close timeout limits how long the caller will wait for an asynchronous Operation to complete after it has been started.
This timeout only applies to asynchronous Operations.
If not set, no Start-to-Close timeout is enforced.
fut := c.ExecuteOperation(ctx, service.HelloOperationName, service.HelloInput{Name: name, Language: language}, workflow.NexusOperationOptions{
StartToCloseTimeout: 5 * time.Minute,
})Add trampolining API for versioned continue-as-new
Added support for workflows to detect when their target deployment version
has changed and opt into upgrading via continue-as-new. New APIs:
- WorkflowInfo.GetTargetWorkflowDeploymentVersionChanged() — check if the
workflow's target version changed - WorkflowInfo.GetContinueAsNewSuggestedReasons() — get reasons why CAN is
suggested - ContinueAsNewVersioningBehaviorAutoUpgrade option for ContinueAsNewError
— explicitly upgrade to the new version on CAN
This enables a "trampolining" pattern: a pinned workflow detects a version
change, then continues-as-new with auto-upgrade to seamlessly move to the
latest deployment version. Both detection and action are fully opt-in,
avoiding accidental infinite CAN loops.
What's Changed
- Nexus caller timeouts by @bergundy in #2146
- Fix cgroup detection condition by @yuandrew in #2179
- Introduce SDK flag to use user DC on Memo's by @yuandrew in #2121
- 💥Add worker heartbeat support by @yuandrew in #2186
- workflowcheck: Fix Go 1.26 false positives for SetFinalizer and godebug.Setting by @cretz in #2192
- Bump github.com/sirupsen/logrus from 1.9.0 to 1.9.1 in /contrib/sysinfo by @dependabot[bot] in #2194
- Change ShutdownWorker err log from Debug to Warn by @yuandrew in #2195
- Make search attribute type more lenient when parsing by @cretz in #2197
- Reduce test flakes by @yuandrew in #2196
- Selector Signal fix with multiple workers by @yuandrew in #2134
- Handle disabled TLS in envconfig ToClientOptions by @dandavison in #2205
- Fix canceling external workflows that are children in testsuite by @yuandrew in #1968
- Fix standalone activity result long-poll bug by @dandavison in #2198
- 💥 Use Temporal Failures for Nexus Error Serialization by @Quinn-With-Two-Ns in #2181
- Fix 2090 child workflow goroutine leak by @kritibehl in #2200
- Add trampolining API for versioned continue-as-new by @THardy98 in #2216
- Upgrade go.opentelemetry.io/otel/sdk to v1.40.0 by @yuandrew in #2218
- Revert "Upgrade go.opentelemetry.io/otel/sdk to v1.40.0" by @yuandrew in #2221
New Contributors
- @kritibehl made their first contribution in #2200
Full Changelog: v1.40.0...v1.41.0
v1.40.0
Breaking Changes
Due to Standalone Activities, testActivityToken are used to keep track of activities, instead of just activityID, they now contain activityID and runID. Most users should not be affected, only if you're manually constructing task tokens in your tests.
Highlights
Versioning v1 and v2 worker options and versioning intent have been marked as deprecated.
Bug fixes
Various test fixes and improvements
Properly set RootWorkflowExecution in child workflow env when testing.
Enforcement of heartbeat and start-to-close timeouts in test environment, as well as properly cancel timer when AwaitWithTimeout condition resolves.
What's Changed
- Additional fields in env config by @stephanos in #2145
- Enforce heartbeat and start-to-close timeouts in test environment by @mfateev in #2144
- Upgrade Datadog tracer to dd-trace-go v2 by @yarinzirlin in #2113
- Add release notes for contrib/datadog v0.5.0 by @yuandrew in #2168
- Cancel timer when AwaitWithTimeout condition resolves by @mfateev in #2153
- fix: set RootWorkflowExecution in child workflow env when testing by @pbrowne011 in #2170
- Fix TestMockCallWrapperNotBefore test flake by @yuandrew in #2173
- Enhance SDK flags so flags are off by default when first introduced by @yuandrew in #2164
- Deprecate v1 and v2 versioning worker options and versioning intent by @carlydf in #2174
- 💥 Standalone activities support by @maciejdudko in #2158
- Switch from docker-compose to samples-server repo by @yuandrew in #2183
- Remove experimental warning for worker deployment versioning and envconfig by @THardy98 in #2176
- bump API to v1.62.1 by @yuandrew in #2187
New Contributors
- @yarinzirlin made their first contribution in #2113
- @pbrowne011 made their first contribution in #2170
Full Changelog: v1.39.0...v1.40.0
v1.39.0
Breaking Changes
It is now assumed that TLS is enabled if API key is provided. A new TLSDisabled ConnectionOption must be specified to explicitly disable TLS when an API key is provided.
Highlights
Plugin support
Plugins are a new way of providing easy configuration of workers and clients
What's Changed
- chore: doc update improving non-determinism explanation by @sateeshkumarb in #2117
- Add temporalnexus.WorkflowHandle.typeMarker by @bergundy in #2116
- Deprecate
PreviousVersionin Versioning responses by @ShahabT in #2119 - Defer updating workflow completion metrics until completion accepted by server by @cretz in #2112
- Upgrade api to 1.59.0 by @bergundy in #2125
- upload nightly worker prom metrics to S3 by @THardy98 in #2127
- 💥 [BREAKING] enable TLS if api key specified by @THardy98 in #2126
- Add SpanFromWorkflowContext function for OTel by @jessefoster in #2118
- Add resource_slots_cpu/mem_usage metrics by @yuandrew in #2122
- Add summary to side effect and mutable side effect by @djeer in #2129
- Bump logrus by @Quinn-With-Two-Ns in #2133
- Support Passing GRPC Header by attaching them to the Context by @chaptersix in #2138
- expose default resource based slot suppliers by @kevinawoo in #1922
- Add OnSideEffect and OnMutableSideEffect test mocks by @mfateev in #2139
- Plugin support by @cretz in #2135
New Contributors
- @sateeshkumarb made their first contribution in #2117
- @jessefoster made their first contribution in #2118
- @djeer made their first contribution in #2129
- @chaptersix made their first contribution in #2138
- @kevinawoo made their first contribution in #1922
Full Changelog: v1.38.0...v1.39.0
v1.38.0
Breaking Changes
When using sessions, deployment info is no longer sent on the worker specific task queue. This should reduce load on the server due to less temporary task queues. No changes in behaviour is expected for session workers.
Bugfixes
Fixed a bug in Poller autoscaling causing maxNumberOfPollers to not be respected.
What’s Changed
2025-10-09 - 2d05a73 - Use macOS 15 intel runners (#2072)
2025-10-13 - a117802 - Set worker version on eager start requests (#2075)
2025-10-13 - d61d5ef - Remove experimental warnings from worker tuners (#2077)
2025-10-14 - ad990a3 - Include failure details in query failure. Improved gRPC message too large detection. Fix flaky TestGrpcMessageTooLarge. (#2078)
2025-10-15 - 09e0634 - Upgrade to Nexus SDK 0.5.1 and inline the client implementation for tests (#2079)
2025-10-17 - f7eff2a - Remove Nexus deprecated APIs (#2081)
2025-10-22 - 8a24b22 - Add nightly throughput stress (#2087)
2025-10-24 - f34365e - Replace tctl references with Temporal CLI (#2080)
2025-10-27 - 2c43194 - Fix envconf docs path (#2093)
2025-10-29 - 5cd20cf - Set explicit permissions for GitHub Actions workflows (#2095)
2025-10-30 - 82be7bc - Cleanup nightly tps workflow (#2091)
2025-11-06 - 4b5d758 - Add actions-read permission to CI workflow (#2100)
2025-11-07 - a451bef - Remove experimental notes from poller behavior docs (#2096)
2025-11-12 - 9efde41 - fix: run maxNumberOfPollers poller routines instead of initialNumberOfPollers (#2105)
2025-11-14 - 7c0ebcf - OpenTelemetry: Specify span kind and don't set error type for benign exception (#2048)
2025-11-19 - 7025a6a - Stop sending deployment info for session per-worker task queue (#2088)
v1.37.0
Breaking Changes
Versioning - Small API Rename
Renamed BuildId to BuildID in WorkerDeploymentVersion to match all other instances and Go naming convention.
Bugfixes
Reverting behavior for unblockSelectorSignal SDK flag
The previous fix introduced with the SDK flag unblockSelectorSignal was found to have a different bug with losing signals. For now the flag is getting turned off, and a more robust solution will be re-introduced in a future release. If anyone happens to rely on this new behavior already, the UNBLOCK_SIGNAL_SELECTOR env var can be set to enable the SDK flag.
What’s Changed
2025-08-27 - b2d1477 - Disable some flaky tests (#2037)
2025-09-02 - a2ac97f - Changes to gRPC message too large error handling (#2042)
2025-09-12 - ef85fee - 💥 Rename BuildId -> BuildID in WorkerDeploymentVersion (#2051)
2025-09-19 - 96d9f2b - Activity reset (#2056)
2025-09-22 - 1528c32 - Add NexusInfo (#2054)
2025-09-23 - ff709e4 - Added retry policy to activity info (#2057)
2025-09-24 - aecdca8 - Fix CA cert config validation (#2052)
2025-10-02 - 8d43143 - populate ManagerIdentity from Describe (#2063)
2025-10-07 - 0968a50 - Pass AllowNoPollers flag to SetCurrentVersion and SetRampingVersion (#2067)
2025-10-07 - 3e46cbd - Fix activity cancelation check (#2069)
2025-10-07 - 5ed31b6 - Revert setting unblockSelectorSignal SDK flag by default (#2070)
2025-10-07 - f88bdd3 - Implement SetWorkerDeploymentManagerIdentity (#2068)
New Contributors
- @kaijchang made their first contribution in #2052
Full Changelog: v1.36.0...v1.37.0