Temporal v1.31.1 Release Notes
Release Date: 2026-06-10 // 4 days ago-
What's Changed
- ⬆️ Bump defaultCliVersion to 1.7.0 by @prathyushpv in #10126
- 🔒 Bump Go toolchain to 1.26.3, thrift to 0.23.0, cli to 1.7.1 (security patch) (#10395) by @fretz12 in #10470
- Cherry-pick: Fix search attribute creation race (#10057) by @fretz12 in #10555
- ⬆️ Cherry-pick: Combine PostgreSQL Visibility schema upgrades from v1.10 through v1.13 (#10371) by @fretz12 in #10556
- ✅ Cherry-pick: PGX SimpleProtocol test suite (#10198) by @fretz12 in #10558
- Cherry-pick: Encode duration as bigint for pgx simple protocol (#10529) by @fretz12 in #10557
- 🚚 Cherry-pick: Remove client cache in RPCFactory (#9277) by @fretz12 in #10561
- Cherry-pick: Close stale gRPC connections in downstream client caches (#10250) by @prathyushpv in #10601
- 🔒 Cherry-pick: Bump x/crypto v0.52.0, x/net v0.55.0, Go 1.26.4 (security patch) (#10604) by @fretz12 in #10609
- ⬆️ Bump ServerVersion to 1.31.1 by @fretz12 in #10516
Full Changelog : v1.31.0...v1.31.1
Previous changes from v1.31.0
-
Schema changes
⚠ Warning
⬆️ Before upgrading your Temporal Cluster to
v1.31.0, you must upgrade core and visibility schema to the following:Core:
- MySQL schema
v1.19 - PostgreSQL schema
v1.19 - SQLite schema
v1.11
- MySQL schema
Visibility:
- Elasticsearch schema
v14 - MySQL schema
v1.14 - PostgreSQL schema
v1.14
- Elasticsearch schema
📚 Please see our upgrade documentation for the necessary steps to upgrade your schemas.
👀 Please see CHASM section below for more information about the core schema change if you have a custom persistence implementation.
Temporal database schema details
MySQL
v1.19, PostgreSQLv1.19, SQLitev1.11— adds a newcurrent_chasm_executionstable for CHASM separate archetype ID spaces:CREATETABLEcurrent\_chasm\_executions( shard_id, namespace_id, business_id, archetype_id, run_id, create_request_id, state, status, start_version, start_time, last_write_version, data, data_encoding,PRIMARY KEY(shard_id, namespace_id, business_id, archetype_id) );Visibility schema details
MySQL
v1.14, PostgreSQLv1.14— addsTemporalExternalPayloadSizeBytesandTemporalExternalPayloadCountas generated columns with indexes.Elasticsearch
v14— new index template version withTemporalExternalPayloadSizeBytesandTemporalExternalPayloadCountfields.CHASM persistence schema change (custom persistence implementations only)
👍 CHASM framework now supports separate
businessIDspaces for different archetypes and includes corresponding schema changes for SQL core databases. This is achieved by storing multiple current mutable state records in the database, one for each archetype.⚡️ If you maintain a custom persistence implementation (Cassandra-based or SQL-based), you must update it to support separate
businessIDspaces as well. All current mutable state related persistence requests now include a newArchetypeIDfield, and your persistence implementation should read or update the current mutable state record for that archetype. Please refer to #8907 (Cassandra) or #8915 (SQL) for sample changes.
Principal Attribution
➕ Adds a server-computed, immutable
Principalfield to workflow history events, providing trustworthy attribution for "who did this?". Unlike the client-suppliedidentityfield,Principalis derived from authenticated context and cannot be spoofed.💻
Principalhas aType/Namepair (e.g.jwt/alice@company.com,temporal/internal) and is surfaced in workflow history, CLI, Web UI, and history exports.0️⃣ The default
AuthorizerpopulatesPrincipalfrom the JWTsubclaim. Users with customAuthorizerimplementations can populatePrincipalby setting the newPrincipalfield onauthorization.Result.To enable this feature, set the dynamic config
system.enablePrincipalAttributiontotrue.Cloud IAM auth for SQL datastores
#9879 introduced new
passwordCommandconfig option for SQL datastores as an alternative to the static password field. When set, Temporal executes the specified command and uses its stdout as the database password, re-running the command on each new physical connection so short-lived credentials stay fresh.🔧 This enables IAM-based auth for cloud-managed databases (e.g. AWS RDS, GCP Cloud SQL) by invoking the provider's CLI. For example, configuring the
passwordCommandto:aws rds generate-db-auth-tokenfor AWS RDSgcloud sql generate-login-tokenfor GCP Cloud SQL
👌 Supported for MySQL and PostgreSQL. Token lifetime is managed through existing config
maxConnLifetime.Nexus
💥 Overhaul Nexus error model
Complete rework of how Nexus errors are handled and converted (#9290).
👻 This change enables Nexus handler errors and operation errors to convey their own messages as opposed to being wrappers for an underlying cause. The change was made to better support Nexus in all languages. There may be slight changes to errors / exception structures in the SDKs.
✂ Remove Nexus feature flag and make Nexus work out of the box
Nexus is now always enabled (#9512).
0️⃣ Use token based routing by default with token-based callback routing (#9513).
Nexus caller timeouts
👌 Support schedule-to-start and start-to-close timeouts for Nexus operations. SDK upgrade required.
🐛 Bug fixes
- 🛠 Fix Nexus non-retryable error when endpoint's namespace target is not found (#9407).
- 🛠 Fix Nexus forwarding criteria (#9182).
- Forward original HTTP headers for Nexus
CompleteOperation(#9053). - Filter internal Nexus headers from being forwarded to user handlers (#9708).
- Do not return no-poller errors for Nexus tasks (#9307).
- 🛠 Fix data race on
nexusEndpointsOwnershipLostCh(#9602).
Metrics
- ➕ Add
nexus_task_requestsmetric withclient_nametag (#9760).
👷 Worker Versioning
👷 Worker Versioning GA
🚀 Worker Deployment APIs are now fully GA. The following APIs have been in Public Preview since server
v1.28.0. They are now considered GA and users can rely on the signature and behavior consistency going forward.- 🚀
DescribeWorkerDeployment - 🚀
DeleteWorkerDeployment - 🚀
ListWorkerDeployments - 🚀
SetWorkerDeploymentManager - 🚀
DescribeWorkerDeploymentVersion - 🚀
DeleteWorkerDeploymentVersion - 🚀
SetWorkerDeploymentCurrentVersion - 🚀
SetWorkerDeploymentRampingVersion - 🚀
UpdateWorkerDeploymentVersionMetadata
⚠ ⚠️💥 Sunsetting Worker Versioning V1 (Version Sets) and V2 (Assignment Rules)
🚚 The following APIs which have been deprecated since
v1.28.0are now officially sunsetted and their support will be removed in the next server version (v1.32.0). Users should migrate their applications to use the Worker Deployment and Worker Deployment Version APIs instead.🚚 APIs to be removed in
v1.32.0:- ⚡️
UpdateWorkerBuildIdCompatibility - 👷
GetWorkerBuildIdCompatibility - ⚡️
UpdateWorkerVersioningRules - 👷
GetWorkerVersioningRules - 👷
GetWorkerTaskReachability
🆕 New Experimental APIs
🚀 The following APIs are added in this release and are in Pre-Release stage as of now. At this stage, the APIs are considered experimental and may see breaking changes in the future:
- 🚀
CreateWorkerDeployment - 🚀
CreateWorkerDeploymentVersion - 🚀
UpdateWorkerDeploymentVersionComputeConfig - 🚀
ValidateWorkerDeploymentVersionComputeConfig
Other Changes
- ➕ Add new ContinueAsNew versioning behavior that continues workflows on the ramping version.
- 🛠 Fixed bug around stuck workflow after reset when WorkflowUpdate was used.
- ➕ Add deployment name and build ID as separate labels on backlog metrics.
- 🚀 Rate-limit worker deployment read APIs and move
ListWorkerDeploymentsto the visibility quota. - Cache task queue routing info in the History service to reduce RPC fan-out.
- 🔖 Version transition from Drained/Inactive to Draining state upon workflow start/moved via Versioning Override is disabled by default until the implementation is optimized in the next release.
- 🛠 Some other minor bug fixes or improvements.
CHASM
- 🚀 CHASM framework is enabled by default in this release, but applications built on top of it are NOT enabled by default to allow safe downgrades.
- 👀 CHASM framework now supports separate
businessIDspaces for different archetypes and includes corresponding schema changes for SQL core databases. See the Schema Changes section above if you maintain a custom persistence implementation.
Standalone Activities
- 0️⃣ Standalone Activities (in public preview) allow activities to run independently of workflows. This feature is gated by the
activity.enableStandalonedynamic config flag, which is disabled by default. Set it totrueto enable. - 🆕 New APIs and capabilities:
DeleteStandaloneActivityAPI for deleting a standalone activity execution. - 🚚 Durability improvements: server-generated request IDs are now preserved across restarts, a standby task discard handler has been added, and the 1-day retention limit has been removed.
- ⏱
PollActivityTaskQueueResponsenow includes additional fields needed by workers running without a parent workflow, such ascurrentAttemptScheduledTimeandnamespace. Termination and cancellation identity is now propagated through failure info. - ⏱ Multiple timing and retry bugs have been fixed, including the Start-To-Close timeout bug and its metric timestamps, incorrect
RetryStatefor schedule timeouts, andTimerTaskStatusreset issues. Heart beating,RecordActivityTaskStarted, and various error codes also received fixes. - Internal task queue name validation has been added for standalone activities and all user-facing APIs.
Task Queue Priority and Fairness GA
- Task queue priority and fairness features are now GA.
- 0️⃣ As part of that, the new matcher component is enabled by default, which means priority keys are respected by default. The new matcher is fully compatible and switching should be transparent, but if you have any issues you can switch back by setting
matching.newUseMatchertofalse(affected task queues will reload immediately). - As before, fairness can be enabled on a task queue, namespace, or cluster level with the
matching.enableFairnessdynamic config. Migration between fairness-enabled and fairness-...