Notable Changes
💥 Breaking Changes
- Renamed and removed several experimental methods and properties in Standalone Activities APIs:
StartActivityOptions.StaticSummaryrenamed toSummary.ActivityExecutionDescription.GetStaticSummaryAsyncrenamed toGetSummaryAsync.ActivityExecution.ScheduledTimerenamed toScheduleTime.- Removed
ActivityExecution.StateTransitionCount. - Removed
ActivityExecutionDescription.LongPollToken. - Removed
ActivityDescribeOptions.LongPollToken.
- Removed the experimental
SignalWithStartWorkflowOptions.RequestId. Request IDs for
workflow-side signal-with-start are now assigned internally and are no longer user-settable.
Added
- New options in
ActivityDescribeOptionsthat can be used to retrieve data associated with
activity execution, such as input and result. - New properties and methods in
ActivityExecutionandActivityExecutionDescription:
ExecutionTime,LastDeploymentVersion,Priority,RetryPolicy,StartDelay,
TotalHeartbeatCount,GetLastFailureAsync,GetOutcomeFailureAsync,GetResultAsync,
and access to raw Proto objects from the response. - Added operation-specific outbound workflow interceptors for Temporal System Nexus operations.
SignalWithStartWorkflowAsynccan now be intercepted before the existing
ScheduleSystemNexusOperationAsynchook. - Experimental Temporal transfer type conversion now supports constructed generic models whose
attributes reference generic converter type definitions. Model type arguments close the converter
directly in declaration order, with matching generic arity and compatible constraints required. - Added
PayloadValidationError.CreateException, which payload converters and codecs can use to
report invalid Nexus operation input with structured details. - The
temporal_activity_execution_failedandtemporal_local_activity_execution_failedworker
metrics now carry afailure_reasonattribute. Each metric is now split into one time series per
reason, which may affect existing dashboards. - 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. - A Nexus operation handler that queries a workflow now attaches a link to the queried
workflow execution on the caller's Nexus operation event. Requires Temporal Server
1.32.0 or later. - Added
LocalActivityOptions.IncludeArgumentsInMarkerto record a local activity's serialized
arguments in its local activity marker, making them visible in workflow history. Defaults to
false.
Changed
- Standalone Activities are now generally available (GA). Standalone activities as Nexus operations
remain experimental. - A non-retryable
ApplicationFailureExceptionwith error typePayloadValidationErrorthrown by a
payload codec or payload converter while decoding Nexus operation input is now reported as a
non-retryableBadRequesthandler exception (with the application failure as its cause) instead of
anInternalone. This lets a data converter signal that the input itself is invalid. The handler
exception is reported asInvalid operation input, which is distinct from thefailed to decode Nexus operation inputmessage used when decoding itself fails. Application failures of any other
error type, and retryablePayloadValidationErrorfailures, keep their existing behavior.
Fixed
- Fixed workflow-side
SignalWithStartWorkflowAsyncto participate in outbound workflow
interception, propagate tracing headers, and apply the target workflow serialization context. - 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, so the activity's result was
never reported and the server had to time the attempt out before retrying it. - 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). - 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. - Update-with-start calls now use the long-poll timeout instead of the normal RPC timeout, avoiding
premature failures while waiting for an update to reach its requested stage. - 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. - Setting
PrometheusOptions.HasCounterTotalSuffixnow actually appends_totalto counter metric
names in the Prometheus exporter output. - 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. - Workers no longer send worker heartbeats or appear in centralized heartbeat reports before they
begin polling. - Ephemeral server processes (such as those started by
WorkflowEnvironment.StartLocalAsync) no
longer leak when the server fails to start. - Nexus links that point at a workflow execution rather than a specific history event were serialized
in a form the server could not parse, so they were silently dropped from the caller's Nexus
operation event. They now use the formtemporal:///namespaces/{ns}/workflows/{wid}/{rid}and
carry the optionalreason. - A Nexus operation backed by a workflow query now fails when the query fails or is
rejected, rather than being retried until the operation times out.
What's Changed
- chore: update baseline to 1.18.0 by @jmaeagle99 in #834
- Test Cloud with ephemeral namespaces by @THardy98 in #822
- fix(test): deflake ExecuteWorkflowAsync_PrematureDispose_WorkflowCompletes by @jmaeagle99 in #839
- Report non-retryable PayloadValidationError as BadRequest by @bergundy in #840
- build(deps): bump jdx/mise-action from 4.2.3 to 4.2.4 in /.github/actions/setup by @dependabot[bot] in #848
- [SDK Sentinel] Deflake activity reset heartbeat ordering by @sdk-sentinel-bot in #847
- fix(test): deflake ExecuteWorkflowAsync_LastResult_ProperlyPresent by @jmaeagle99 in #849
- fix(tests): deflake Nexus operation timeout tests by @jmaeagle99 in #850
- OpenTelemetry common-core refactor by @eamsden in #844
- Add payload validation exception factory by @bergundy in #853
- Classify and separate .NET tests for Cloud execution by @THardy98 in #823
- Add SDK Sentinel PR responder by @Sushisource in #858
- build(deps): bump actions/create-github-app-token from 2.2.2 to 3.2.0 by @dependabot[bot] in #859
- chore: update .NET SDK to 10.0.400 by @jmaeagle99 in #861
- build(deps): update Swatinem/rust-cache action to latest release version by @jmaeagle99 in #862
- chore: convert sln to slnx by @jmaeagle99 in #836
- Add System Nexus transfer payload converter by @tconley1428 in #846
- Use shared changelog workflow by @Sushisource in #864
- fix: mark system Nexus envelope payloads by @tconley1428 in #799
- Support generic transfer type converters by @VegetarianOrc in #867
- chore: update sdk-core submodule by @jmaeagle99 in #866
- build(deps): bump jdx/mise-action from 4.2.4 to 4.2.5 in /.github/actions/setup by @dependabot[bot] in #872
- Bump Microsoft.NET.Test.Sdk from 18.8.1 to 18.9.0 by @dependabot[bot] in #875
- Add regression test for Activity completion-after-shutdown by @Sushisource in #879
- Bump the xunit group with 1 update by @dependabot[bot] in #874
- Add System Nexus signal-with-start support by @tconley1428 in #863
- Adding SDK Ergonomics Query link by @Evanthx in #825
- feat: add typed System Nexus workflow interceptors by @tconley1428 in #870
- feat: support recording local activity arguments in marker by @jmaeagle99 in #871
- chore(deps): bump jdx/mise-action from 4.2.5 to 4.3.0 in /.github/actions/setup by @dependabot[bot] in #885
- Bump Xunit.SkippableFact from 1.5.61 to 1.5.85 by @dependabot[bot] in #886
- ci: use latest from features repo by @jmaeagle99 in #888
- 💥 Update ActivityExecutionDescription to support new API, rename StaticSummary to Summary by @maciejdudko in #869
- chore: update sdk-core submodule by @jmaeagle99 in #889
- docs: remove experimental warnings from standalone activity APIs by @jmaeagle99 in #893
- chore: update sdk version to 1.19.0 by @jmaeagle99 in #890
- fix: correct release date by @jmaeagle99 in #896
SDK Core Update
Updated from temporalio/sdk-rust@78ac17e to temporalio/sdk-rust@399cb7a
- feat(sdk): add WorkflowReplayer in temporalio/sdk-rust#1460
- feat(sdk): add worker lifecycle methods in temporalio/sdk-rust#1468
- chore(sdk): remove composing interceptor in temporalio/sdk-rust#1469
- feat(sdk): infer worker task types from registrations in temporalio/sdk-rust#1471
- fix(sdk): remove wait stage from
start_updatein temporalio/sdk-rust#1470 - Kill ephemeral server process when start fails in temporalio/sdk-rust#1474
- Updating Temporal API Protos in temporalio/sdk-rust#1486
- Add changelog release notes CLI in temporalio/sdk-rust#1487
- Add JSON logging format in temporalio/sdk-rust#1485
- Only begin heartbeating once a worker has actually begun polling in temporalio/sdk-rust#1488
- fix(sdk): payload conversion causes wft failure in temporalio/sdk-rust#1489
- Normalize workflow's SignalWorkflowOptions in temporalio/sdk-rust#1493
- 💥 feat(sdk): Support Standalone Activities in temporalio/sdk-rust#1402
- Scope docker_metrics_with_prometheus query to the test's task queue in temporalio/sdk-rust#1495
- Keep the in-Docker environment check offline in temporalio/sdk-rust#1496
- Fix integ test failure for activity cancellation against Server v1.32.0-158.0 in temporalio/sdk-rust#1498
- Tolerate out-of-grammar nexus request-timeout headers in temporalio/sdk-rust#1497
- Add Event Groups (Core) in temporalio/sdk-rust#1308
- Update API upstream in temporalio/sdk-rust#1504
- feat(sdk): add activity and workflow test env in temporalio/sdk-rust#1492
- chore(sdk): release 0.7.0 in temporalio/sdk-rust#1494
- Expose cancel details on workflow cancel & propagate them in Rust SDK in temporalio/sdk-rust#1501
- feat(client): allow setting memo on workflow start in temporalio/sdk-rust#1443
- Add warning on worker deployment limits in temporalio/sdk-rust#1500
- Fix CI flake detected by SDK Sentinel (rust) in temporalio/sdk-rust#1507
- feat(sdk): add WorkflowContext::all_handlers_finished in temporalio/sdk-rust#1505
- fix(sdk): typed signal_with_start_workflow in temporalio/sdk-rust#1508
- chore: remove some trybuild tests in temporalio/sdk-rust#1510
- Add workflow for sentinel comment responses in temporalio/sdk-rust#1514
- Preserve Event Group Markers on cancellation commands in temporalio/sdk-rust#1512
- Serialize C-bridge ephemeral server tests in temporalio/sdk-rust#1513
- [SDK Sentinel] Stabilize legacy query integration test ordering in temporalio/sdk-rust#1511
- feat(metrics): emit
failure_reasonon existing activity failure metrics in temporalio/sdk-rust#1517 - Move changelog release notes helper to its own crate in temporalio/sdk-rust#1519
- Update api_upstream in temporalio/sdk-rust#1520
- chore(ci): let dependabot skip cloud tests in temporalio/sdk-rust#1528
- Thread counters_total_suffix through prometheus exporter in temporalio/sdk-rust#1531
- Allow including LA arguments in marker in temporalio/sdk-rust#1532
- Run integration tests against envconfig-backed Cloud namespaces in temporalio/sdk-rust#1483
- feat: workflow command pagination in temporalio/sdk-rust#1515
- build(deps): update base64 requirement from 0.22 to 0.23 in temporalio/sdk-rust#1525
- fix(sdk): mark remaining public types with
non_exhaustivein temporalio/sdk-rust#1536 - Stabilize heartbeat timeout codec test in temporalio/sdk-rust#1539
- feat(client): add update-with-start support in temporalio/sdk-rust#1438
- Fix non-sticky WFT poller starvation with small workflow cache in temporalio/sdk-rust#1534
- Fix worker shutdown racing in-flight activity completions in temporalio/sdk-rust#1538
- feat(sdk): add
WorkflowHandle::get_update_handlein temporalio/sdk-rust#1540 - Use shared changelog workflow in temporalio/sdk-rust#1535
- build(deps): bump hoverkraft-tech/compose-action from 2.6.0 to 3.1.0 in temporalio/sdk-rust#1522
- chore(docs): add missing readmes in temporalio/sdk-rust#1551
- fix(sdk): encode None as binary/null in temporalio/sdk-rust#1543
- fix(sdk): encode Vec as binary/plain in temporalio/sdk-rust#1547
- chore(sdk): refactor data converter in temporalio/sdk-rust#1549
- feat(sdk): make fetching workflow history lazy in temporalio/sdk-rust#1552
- feat(sdk): add encode_common_attributes to DefaultFailureConverter in temporalio/sdk-rust#1541
- Update api_upstream in temporalio/sdk-rust#1545
- chore(sdk): make serialization context extensible in temporalio/sdk-rust#1553
- chore(sdk): rename include_arguments_into_marker to include_arguments_in_marker in temporalio/sdk-rust#1554
- chore(sdk): automate crate release in temporalio/sdk-rust#1550
- Fix flaky post-cancel abandoned child test in temporalio/sdk-rust#1555
- Stabilize Nexus async outcome deadlines in temporalio/sdk-rust#1556
- Add named deterministic workflow random streams in temporalio/sdk-rust#1557
- feat(sdk): gate experimental APIs behind feature in temporalio/sdk-rust#1395
- 💥 Use context-sensitive randomness for workflow views in temporalio/sdk-rust#1558
- Make SdkWakeGuard thread-bound in temporalio/sdk-rust#1562
- Synchronize cgroup memory test refresh in temporalio/sdk-rust#1559
- chore(sdk): make publish idempotent in temporalio/sdk-rust#1561
- chore(sdk): prepare for 0.8.0 release in temporalio/sdk-rust#1560
- chore(sdk): resolve some doc(hidden) APIs in temporalio/sdk-rust#1563
- chore(sdk): limit macro exports in temporalio/sdk-rust#1564
- docs: update API WIT documentation in temporalio/sdk-rust#1573
- chore(sdk): use correct repo in cargo toml in temporalio/sdk-rust#1567
- chore(sdk): mark remaining error enums as non exhaustive in temporalio/sdk-rust#1568
- feat(sdk): add not found variant for signal/cancel external wf in temporalio/sdk-rust#1569
- chore(sdk): mark pub test utilities as experimental in temporalio/sdk-rust#1570
- chore(core): remove doc hidden from runtime opts in temporalio/sdk-rust#1572
- Add workflow-scoped context storage in temporalio/sdk-rust#1580
- fix(sdk): ensure memo/search attribute keys are determistic in temporalio/sdk-rust#1576
- chore(sdk): add SDK owned types over using core directly in temporalio/sdk-rust#1577
- chore(sdk): provide concrete types for worker tuning in temporalio/sdk-rust#1581
- chore(sdk): limit reexport of core worker and worker config in temporalio/sdk-rust#1582
- chore: add msrv to every crate in temporalio/sdk-rust#1587
- fix(sdk/testing): hide cancellation token from public API in temporalio/sdk-rust#1588
- chore(sdk): keep proto/core in sync in temporalio/sdk-rust#1583
- fix(sdk): add sdk owned wrappers for some proto types exposed in client in temporalio/sdk-rust#1584
- feat(client): allow usage of protox instead of system protoc in temporalio/sdk-rust#1590
- chore: release 1.0.0 in temporalio/sdk-rust#1586
New Contributors
- @sdk-sentinel-bot made their first contribution in #847
- @VegetarianOrc made their first contribution in #867
Full Changelog: 1.18.0...1.19.0