From b466ee47af38a952104205ed30d0ea600baccefb Mon Sep 17 00:00:00 2001 From: Feiyang Xie Date: Sun, 22 Mar 2026 18:01:38 -0700 Subject: [PATCH 1/6] api for automatic timeskipping --- openapi/openapiv2.json | 44 ++++++++++++++++++- openapi/openapiv3.yaml | 43 ++++++++++++++++++ temporal/api/enums/v1/event_type.proto | 2 + temporal/api/history/v1/message.proto | 14 ++++++ temporal/api/workflow/v1/message.proto | 22 ++++++++++ .../workflowservice/v1/request_response.proto | 4 ++ 6 files changed, 127 insertions(+), 2 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index 5b5719cc7..e663563cf 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -9879,6 +9879,10 @@ "priority": { "$ref": "#/definitions/v1Priority", "title": "Priority metadata" + }, + "timeSkippingConfig": { + "$ref": "#/definitions/v1TimeSkippingConfig", + "description": "Time skipping configuration. If not set, automatic time-skipping is disabled." } } }, @@ -10155,6 +10159,10 @@ "eagerWorkerDeploymentOptions": { "$ref": "#/definitions/v1WorkerDeploymentOptions", "description": "Deployment Options of the worker who will process the eager task. Passed when `request_eager_execution=true`." + }, + "timeSkippingConfig": { + "$ref": "#/definitions/v1TimeSkippingConfig", + "description": "Automatic time-skipping configuration. If not set, automatic time-skipping is disabled." } } }, @@ -12627,10 +12635,11 @@ "EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_COMPLETED", "EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED", "EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED", - "EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED" + "EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED", + "EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED" ], "default": "EVENT_TYPE_UNSPECIFIED", - "description": "- EVENT_TYPE_UNSPECIFIED: Place holder and should never appear in a Workflow execution history\n - EVENT_TYPE_WORKFLOW_EXECUTION_STARTED: Workflow execution has been triggered/started\nIt contains Workflow execution inputs, as well as Workflow timeout configurations\n - EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: Workflow execution has successfully completed and contains Workflow execution results\n - EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: Workflow execution has unsuccessfully completed and contains the Workflow execution error\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: Workflow execution has timed out by the Temporal Server\nUsually due to the Workflow having not been completed within timeout settings\n - EVENT_TYPE_WORKFLOW_TASK_SCHEDULED: Workflow Task has been scheduled and the SDK client should now be able to process any new history events\n - EVENT_TYPE_WORKFLOW_TASK_STARTED: Workflow Task has started and the SDK client has picked up the Workflow Task and is processing new history events\n - EVENT_TYPE_WORKFLOW_TASK_COMPLETED: Workflow Task has completed\nThe SDK client picked up the Workflow Task and processed new history events\nSDK client may or may not ask the Temporal Server to do additional work, such as:\nEVENT_TYPE_ACTIVITY_TASK_SCHEDULED\nEVENT_TYPE_TIMER_STARTED\nEVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\nEVENT_TYPE_MARKER_RECORDED\nEVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\nEVENT_TYPE_WORKFLOW_EXECUTION_FAILED\nEVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\nEVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW\n - EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT: Workflow Task encountered a timeout\nEither an SDK client with a local cache was not available at the time, or it took too long for the SDK client to process the task\n - EVENT_TYPE_WORKFLOW_TASK_FAILED: Workflow Task encountered a failure\nUsually this means that the Workflow was non-deterministic\nHowever, the Workflow reset functionality also uses this event\n - EVENT_TYPE_ACTIVITY_TASK_SCHEDULED: Activity Task was scheduled\nThe SDK client should pick up this activity task and execute\nThis event type contains activity inputs, as well as activity timeout configurations\n - EVENT_TYPE_ACTIVITY_TASK_STARTED: Activity Task has started executing\nThe SDK client has picked up the Activity Task and is processing the Activity invocation\n - EVENT_TYPE_ACTIVITY_TASK_COMPLETED: Activity Task has finished successfully\nThe SDK client has picked up and successfully completed the Activity Task\nThis event type contains Activity execution results\n - EVENT_TYPE_ACTIVITY_TASK_FAILED: Activity Task has finished unsuccessfully\nThe SDK picked up the Activity Task but unsuccessfully completed it\nThis event type contains Activity execution errors\n - EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT: Activity has timed out according to the Temporal Server\nActivity did not complete within the timeout settings\n - EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED: A request to cancel the Activity has occurred\nThe SDK client will be able to confirm cancellation of an Activity during an Activity heartbeat\n - EVENT_TYPE_ACTIVITY_TASK_CANCELED: Activity has been cancelled\n - EVENT_TYPE_TIMER_STARTED: A timer has started\n - EVENT_TYPE_TIMER_FIRED: A timer has fired\n - EVENT_TYPE_TIMER_CANCELED: A time has been cancelled\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED: A request has been made to cancel the Workflow execution\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: SDK client has confirmed the cancellation request and the Workflow execution has been cancelled\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Workflow has requested that the Temporal Server try to cancel another Workflow\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server could not cancel the targeted Workflow\nThis is usually because the target Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED: Temporal Server has successfully requested the cancellation of the target Workflow\n - EVENT_TYPE_MARKER_RECORDED: A marker has been recorded.\nThis event type is transparent to the Temporal Server\nThe Server will only store it and will not try to understand it.\n - EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED: Workflow has received a Signal event\nThe event type contains the Signal name, as well as a Signal payload\n - EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: Workflow execution has been forcefully terminated\nThis is usually because the terminate Workflow API was called\n - EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: Workflow has successfully completed and a new Workflow has been started within the same transaction\nContains last Workflow execution results as well as new Workflow execution inputs\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to start a child Workflow\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution cannot be started/triggered\nUsually due to a child Workflow ID collision\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED: Child Workflow execution has successfully started/triggered\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED: Child Workflow execution has successfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution has unsuccessfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED: Child Workflow execution has been cancelled\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TIMED_OUT: Child Workflow execution has timed out by the Temporal Server\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TERMINATED: Child Workflow execution has been terminated\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to Signal the targeted Workflow\nContains the Signal name, as well as a Signal payload\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server cannot Signal the targeted Workflow\nUsually because the Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED: Temporal Server has successfully Signaled the targeted Workflow\n - EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES: Workflow search attributes should be updated and synchronized with the visibility store\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ADMITTED: An update was admitted. Note that not all admitted updates result in this\nevent. See UpdateAdmittedEventOrigin for situations in which this event\nis created.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED: An update was accepted (i.e. passed validation, perhaps because no validator was defined)\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_REJECTED: This event is never written to history.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED: An update completed\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of the workflow as a whole have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_ACTIVITY_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of an already-scheduled activity have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED: Workflow properties modified by user workflow code\n - EVENT_TYPE_NEXUS_OPERATION_SCHEDULED: A Nexus operation was scheduled using a ScheduleNexusOperation command.\n - EVENT_TYPE_NEXUS_OPERATION_STARTED: An asynchronous Nexus operation was started by a Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_COMPLETED: A Nexus operation completed successfully.\n - EVENT_TYPE_NEXUS_OPERATION_FAILED: A Nexus operation failed.\n - EVENT_TYPE_NEXUS_OPERATION_CANCELED: A Nexus operation completed as canceled.\n - EVENT_TYPE_NEXUS_OPERATION_TIMED_OUT: A Nexus operation timed out.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUESTED: A Nexus operation was requested to be canceled using a RequestCancelNexusOperation command.\n - EVENT_TYPE_WORKFLOW_EXECUTION_OPTIONS_UPDATED: Workflow execution options updated by user.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_COMPLETED: A cancellation request for a Nexus operation was successfully delivered to the Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED: A cancellation request for a Nexus operation resulted in an error.\n - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED: An event that indicates that the workflow execution has been paused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: An event that indicates that the previously paused workflow execution has been unpaused.", + "description": "- EVENT_TYPE_UNSPECIFIED: Place holder and should never appear in a Workflow execution history\n - EVENT_TYPE_WORKFLOW_EXECUTION_STARTED: Workflow execution has been triggered/started\nIt contains Workflow execution inputs, as well as Workflow timeout configurations\n - EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: Workflow execution has successfully completed and contains Workflow execution results\n - EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: Workflow execution has unsuccessfully completed and contains the Workflow execution error\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: Workflow execution has timed out by the Temporal Server\nUsually due to the Workflow having not been completed within timeout settings\n - EVENT_TYPE_WORKFLOW_TASK_SCHEDULED: Workflow Task has been scheduled and the SDK client should now be able to process any new history events\n - EVENT_TYPE_WORKFLOW_TASK_STARTED: Workflow Task has started and the SDK client has picked up the Workflow Task and is processing new history events\n - EVENT_TYPE_WORKFLOW_TASK_COMPLETED: Workflow Task has completed\nThe SDK client picked up the Workflow Task and processed new history events\nSDK client may or may not ask the Temporal Server to do additional work, such as:\nEVENT_TYPE_ACTIVITY_TASK_SCHEDULED\nEVENT_TYPE_TIMER_STARTED\nEVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\nEVENT_TYPE_MARKER_RECORDED\nEVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\nEVENT_TYPE_WORKFLOW_EXECUTION_FAILED\nEVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\nEVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW\n - EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT: Workflow Task encountered a timeout\nEither an SDK client with a local cache was not available at the time, or it took too long for the SDK client to process the task\n - EVENT_TYPE_WORKFLOW_TASK_FAILED: Workflow Task encountered a failure\nUsually this means that the Workflow was non-deterministic\nHowever, the Workflow reset functionality also uses this event\n - EVENT_TYPE_ACTIVITY_TASK_SCHEDULED: Activity Task was scheduled\nThe SDK client should pick up this activity task and execute\nThis event type contains activity inputs, as well as activity timeout configurations\n - EVENT_TYPE_ACTIVITY_TASK_STARTED: Activity Task has started executing\nThe SDK client has picked up the Activity Task and is processing the Activity invocation\n - EVENT_TYPE_ACTIVITY_TASK_COMPLETED: Activity Task has finished successfully\nThe SDK client has picked up and successfully completed the Activity Task\nThis event type contains Activity execution results\n - EVENT_TYPE_ACTIVITY_TASK_FAILED: Activity Task has finished unsuccessfully\nThe SDK picked up the Activity Task but unsuccessfully completed it\nThis event type contains Activity execution errors\n - EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT: Activity has timed out according to the Temporal Server\nActivity did not complete within the timeout settings\n - EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED: A request to cancel the Activity has occurred\nThe SDK client will be able to confirm cancellation of an Activity during an Activity heartbeat\n - EVENT_TYPE_ACTIVITY_TASK_CANCELED: Activity has been cancelled\n - EVENT_TYPE_TIMER_STARTED: A timer has started\n - EVENT_TYPE_TIMER_FIRED: A timer has fired\n - EVENT_TYPE_TIMER_CANCELED: A time has been cancelled\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED: A request has been made to cancel the Workflow execution\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: SDK client has confirmed the cancellation request and the Workflow execution has been cancelled\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Workflow has requested that the Temporal Server try to cancel another Workflow\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server could not cancel the targeted Workflow\nThis is usually because the target Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED: Temporal Server has successfully requested the cancellation of the target Workflow\n - EVENT_TYPE_MARKER_RECORDED: A marker has been recorded.\nThis event type is transparent to the Temporal Server\nThe Server will only store it and will not try to understand it.\n - EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED: Workflow has received a Signal event\nThe event type contains the Signal name, as well as a Signal payload\n - EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: Workflow execution has been forcefully terminated\nThis is usually because the terminate Workflow API was called\n - EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: Workflow has successfully completed and a new Workflow has been started within the same transaction\nContains last Workflow execution results as well as new Workflow execution inputs\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to start a child Workflow\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution cannot be started/triggered\nUsually due to a child Workflow ID collision\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED: Child Workflow execution has successfully started/triggered\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED: Child Workflow execution has successfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution has unsuccessfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED: Child Workflow execution has been cancelled\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TIMED_OUT: Child Workflow execution has timed out by the Temporal Server\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TERMINATED: Child Workflow execution has been terminated\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to Signal the targeted Workflow\nContains the Signal name, as well as a Signal payload\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server cannot Signal the targeted Workflow\nUsually because the Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED: Temporal Server has successfully Signaled the targeted Workflow\n - EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES: Workflow search attributes should be updated and synchronized with the visibility store\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ADMITTED: An update was admitted. Note that not all admitted updates result in this\nevent. See UpdateAdmittedEventOrigin for situations in which this event\nis created.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED: An update was accepted (i.e. passed validation, perhaps because no validator was defined)\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_REJECTED: This event is never written to history.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED: An update completed\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of the workflow as a whole have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_ACTIVITY_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of an already-scheduled activity have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED: Workflow properties modified by user workflow code\n - EVENT_TYPE_NEXUS_OPERATION_SCHEDULED: A Nexus operation was scheduled using a ScheduleNexusOperation command.\n - EVENT_TYPE_NEXUS_OPERATION_STARTED: An asynchronous Nexus operation was started by a Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_COMPLETED: A Nexus operation completed successfully.\n - EVENT_TYPE_NEXUS_OPERATION_FAILED: A Nexus operation failed.\n - EVENT_TYPE_NEXUS_OPERATION_CANCELED: A Nexus operation completed as canceled.\n - EVENT_TYPE_NEXUS_OPERATION_TIMED_OUT: A Nexus operation timed out.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUESTED: A Nexus operation was requested to be canceled using a RequestCancelNexusOperation command.\n - EVENT_TYPE_WORKFLOW_EXECUTION_OPTIONS_UPDATED: Workflow execution options updated by user.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_COMPLETED: A cancellation request for a Nexus operation was successfully delivered to the Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED: A cancellation request for a Nexus operation resulted in an error.\n - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED: An event that indicates that the workflow execution has been paused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: An event that indicates that the previously paused workflow execution has been unpaused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED: An event that indicates that some duration was skipped for this workflow execution.", "title": "Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering" }, "v1ExternalWorkflowExecutionCancelRequestedEventAttributes": { @@ -13228,6 +13237,9 @@ }, "workflowExecutionUnpausedEventAttributes": { "$ref": "#/definitions/v1WorkflowExecutionUnpausedEventAttributes" + }, + "workflowExecutionTimeSkippedEventAttributes": { + "$ref": "#/definitions/v1WorkflowExecutionTimeSkippedEventAttributes" } }, "description": "History events are the method by which Temporal SDKs advance (or recreate) workflow state.\nSee the `EventType` enum for more info about what each event is for." @@ -16282,6 +16294,16 @@ "v1TerminatedFailureInfo": { "type": "object" }, + "v1TimeSkippingConfig": { + "type": "object", + "properties": { + "enabled": { + "type": "boolean", + "description": "If set, enables automatic time-skipping for this workflow execution.\nIt can also be disabled by setting this field to false.\nSpecial attention for transitively related workflows:\n- By default, Child workflows and Continue-As-New workflows will \ninherit the enabled config but only at the time they are started.\n- But if the enabled config is flipped after a child/continue-as-new workflow is started, \nthe propagation won't happen. It not recommended flip the parent's enabled config\nwhen there are in-flight child/continue-as-new workflows." + } + }, + "description": "Configuration for automatic time skipping on a workflow execution.\nOnce enabled, time automatically advances when there is no in-flight \nactivities, child workflows, or Nexus operations." + }, "v1TimeoutFailureInfo": { "type": "object", "properties": { @@ -17545,6 +17567,10 @@ "priority": { "$ref": "#/definitions/v1Priority", "description": "If set, overrides the workflow's priority sent by the SDK." + }, + "timeSkippingConfig": { + "$ref": "#/definitions/v1TimeSkippingConfig", + "description": "Time-skipping configuration for this workflow execution.\nIf not set, the time-skipping conf will not get updated upon request, \ni.e. the existing time-skipping conf will be preserved." } } }, @@ -17578,6 +17604,10 @@ "priority": { "$ref": "#/definitions/v1Priority", "description": "Priority override upserted in this event. Represents the full priority; not just partial fields.\nIgnored if nil." + }, + "timeSkippingConfig": { + "$ref": "#/definitions/v1TimeSkippingConfig", + "description": "Time skipping configuration upserted in this event. \nIt means the time-skipping config is changed, and the full latest config is upserted." } } }, @@ -17838,6 +17868,16 @@ } } }, + "v1WorkflowExecutionTimeSkippedEventAttributes": { + "type": "object", + "properties": { + "toTime": { + "type": "string", + "format": "date-time" + } + }, + "description": "Attributes for an event marking that a duration was skipped for a workflow execution,\neither via manual time-skipping api call or automatic time-skipping." + }, "v1WorkflowExecutionTimedOutEventAttributes": { "type": "object", "properties": { diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index c2dbbc15d..ea72e3662 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -10157,6 +10157,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED type: string format: enum version: @@ -10315,6 +10316,8 @@ components: $ref: '#/components/schemas/WorkflowExecutionPausedEventAttributes' workflowExecutionUnpausedEventAttributes: $ref: '#/components/schemas/WorkflowExecutionUnpausedEventAttributes' + workflowExecutionTimeSkippedEventAttributes: + $ref: '#/components/schemas/WorkflowExecutionTimeSkippedEventAttributes' description: |- History events are the method by which Temporal SDKs advance (or recreate) workflow state. See the `EventType` enum for more info about what each event is for. @@ -11067,6 +11070,8 @@ components: Calls are retried internally by the server. (-- api-linter: core::0140::prepositions=disabled aip.dev/not-precedent: "to" is used to indicate interval. --) + (-- api-linter: core::0142::time-field-names=disabled + aip.dev/not-precedent: "timeout" is an acceptable suffix for duration fields in this API. --) nexusHeader: type: object additionalProperties: @@ -12258,6 +12263,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED type: string description: The event type of the history event generated by the request. format: enum @@ -13571,6 +13577,10 @@ components: allOf: - $ref: '#/components/schemas/Priority' description: Priority metadata + timeSkippingConfig: + allOf: + - $ref: '#/components/schemas/TimeSkippingConfig' + description: Time skipping configuration. If not set, automatic time-skipping is disabled. SignalWithStartWorkflowExecutionResponse: type: object properties: @@ -14033,6 +14043,10 @@ components: allOf: - $ref: '#/components/schemas/WorkerDeploymentOptions' description: Deployment Options of the worker who will process the eager task. Passed when `request_eager_execution=true`. + timeSkippingConfig: + allOf: + - $ref: '#/components/schemas/TimeSkippingConfig' + description: Automatic time-skipping configuration. If not set, automatic time-skipping is disabled. StartWorkflowExecutionResponse: type: object properties: @@ -14436,6 +14450,13 @@ components: TerminatedFailureInfo: type: object properties: {} + TimeSkippingConfig: + type: object + properties: + enabled: + type: boolean + description: "If set, enables automatic time-skipping for this workflow execution.\n It can also be disabled by setting this field to false.\n Special attention for transitively related workflows:\n - By default, Child workflows and Continue-As-New workflows will \n inherit the enabled config but only at the time they are started.\n - But if the enabled config is flipped after a child/continue-as-new workflow is started, \n the propagation won't happen. It not recommended flip the parent's enabled config\n when there are in-flight child/continue-as-new workflows." + description: "Configuration for automatic time skipping on a workflow execution.\n Once enabled, time automatically advances when there is no in-flight \n activities, child workflows, or Nexus operations." TimeoutFailureInfo: type: object properties: @@ -15866,6 +15887,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED type: string format: enum description: EventReference is a direct reference to a history event through the event ID. @@ -15936,6 +15958,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED type: string format: enum description: RequestIdReference is a indirect reference to a history event through the request ID. @@ -16285,6 +16308,10 @@ components: allOf: - $ref: '#/components/schemas/Priority' description: If set, overrides the workflow's priority sent by the SDK. + timeSkippingConfig: + allOf: + - $ref: '#/components/schemas/TimeSkippingConfig' + description: "Time-skipping configuration for this workflow execution.\n If not set, the time-skipping conf will not get updated upon request, \n i.e. the existing time-skipping conf will be preserved." WorkflowExecutionOptionsUpdatedEventAttributes: type: object properties: @@ -16316,6 +16343,10 @@ components: description: |- Priority override upserted in this event. Represents the full priority; not just partial fields. Ignored if nil. + timeSkippingConfig: + allOf: + - $ref: '#/components/schemas/TimeSkippingConfig' + description: "Time skipping configuration upserted in this event. \n It means the time-skipping config is changed, and the full latest config is upserted." WorkflowExecutionPauseInfo: type: object properties: @@ -16621,6 +16652,18 @@ components: identity: type: string description: id of the client who requested termination + WorkflowExecutionTimeSkippedEventAttributes: + type: object + properties: + toTime: + type: string + description: |- + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "to" is used to indicate target time point. --) + format: date-time + description: |- + Attributes for an event marking that a duration was skipped for a workflow execution, + either via manual time-skipping api call or automatic time-skipping. WorkflowExecutionTimedOutEventAttributes: type: object properties: diff --git a/temporal/api/enums/v1/event_type.proto b/temporal/api/enums/v1/event_type.proto index 26a512992..26e3387d7 100644 --- a/temporal/api/enums/v1/event_type.proto +++ b/temporal/api/enums/v1/event_type.proto @@ -173,4 +173,6 @@ enum EventType { EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58; // An event that indicates that the previously paused workflow execution has been unpaused. EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59; + // An event that indicates that some duration was skipped for this workflow execution. + EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED = 60; } diff --git a/temporal/api/history/v1/message.proto b/temporal/api/history/v1/message.proto index 34a4286eb..78c05c7dc 100644 --- a/temporal/api/history/v1/message.proto +++ b/temporal/api/history/v1/message.proto @@ -873,6 +873,9 @@ message WorkflowExecutionOptionsUpdatedEventAttributes { // Priority override upserted in this event. Represents the full priority; not just partial fields. // Ignored if nil. temporal.api.common.v1.Priority priority = 6; + // Time skipping configuration upserted in this event. + // It means the time-skipping config is changed, and the full latest config is upserted. + temporal.api.workflow.v1.TimeSkippingConfig time_skipping_config = 7; } // Not used anywhere. Use case is replaced by WorkflowExecutionOptionsUpdatedEventAttributes @@ -965,6 +968,14 @@ message WorkflowExecutionUnpausedEventAttributes { string request_id = 3; } +// Attributes for an event marking that a duration was skipped for a workflow execution, +// either via manual time-skipping api call or automatic time-skipping. +message WorkflowExecutionTimeSkippedEventAttributes { + // (-- api-linter: core::0140::prepositions=disabled + // aip.dev/not-precedent: "to" is used to indicate target time point. --) + google.protobuf.Timestamp to_time = 1; +} + // Event marking that an operation was scheduled by a workflow via the ScheduleNexusOperation command. message NexusOperationScheduledEventAttributes { // Endpoint name, must exist in the endpoint registry. @@ -982,6 +993,8 @@ message NexusOperationScheduledEventAttributes { // Calls are retried internally by the server. // (-- api-linter: core::0140::prepositions=disabled // aip.dev/not-precedent: "to" is used to indicate interval. --) + // (-- api-linter: core::0142::time-field-names=disabled + // aip.dev/not-precedent: "timeout" is an acceptable suffix for duration fields in this API. --) google.protobuf.Duration schedule_to_close_timeout = 5; // Header to attach to the Nexus request. Note these headers are not the same as Temporal headers on internal // activities and child workflows, these are transmitted to Nexus operations that may be external and are not @@ -1199,6 +1212,7 @@ message HistoryEvent { NexusOperationCancelRequestFailedEventAttributes nexus_operation_cancel_request_failed_event_attributes = 62; WorkflowExecutionPausedEventAttributes workflow_execution_paused_event_attributes = 63; WorkflowExecutionUnpausedEventAttributes workflow_execution_unpaused_event_attributes = 64; + WorkflowExecutionTimeSkippedEventAttributes workflow_execution_time_skipped_event_attributes = 65; } } diff --git a/temporal/api/workflow/v1/message.proto b/temporal/api/workflow/v1/message.proto index 40753b2ce..e34aaa444 100644 --- a/temporal/api/workflow/v1/message.proto +++ b/temporal/api/workflow/v1/message.proto @@ -566,6 +566,28 @@ message WorkflowExecutionOptions { // If set, overrides the workflow's priority sent by the SDK. temporal.api.common.v1.Priority priority = 2; + + // Time-skipping configuration for this workflow execution. + // If not set, the time-skipping conf will not get updated upon request, + // i.e. the existing time-skipping conf will be preserved. + TimeSkippingConfig time_skipping_config = 3; +} + +// Configuration for automatic time skipping on a workflow execution. +// Once enabled, time automatically advances when there is no in-flight +// activities, child workflows, or Nexus operations. +message TimeSkippingConfig { + + // If set, enables automatic time-skipping for this workflow execution. + // It can also be disabled by setting this field to false. + // Special attention for transitively related workflows: + // - By default, Child workflows and Continue-As-New workflows will + // inherit the enabled config but only at the time they are started. + // - But if the enabled config is flipped after a child/continue-as-new workflow is started, + // the propagation won't happen. It not recommended flip the parent's enabled config + // when there are in-flight child/continue-as-new workflows. + bool enabled = 1; + } // Used to override the versioning behavior (and pinned deployment version, if applicable) of a diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 7bfcf236e..0bc279fcb 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -197,6 +197,8 @@ message StartWorkflowExecutionRequest { temporal.api.common.v1.Priority priority = 27; // Deployment Options of the worker who will process the eager task. Passed when `request_eager_execution=true`. temporal.api.deployment.v1.WorkerDeploymentOptions eager_worker_deployment_options = 28; + // Automatic time-skipping configuration. If not set, automatic time-skipping is disabled. + temporal.api.workflow.v1.TimeSkippingConfig time_skipping_config = 29; } message StartWorkflowExecutionResponse { @@ -836,6 +838,8 @@ message SignalWithStartWorkflowExecutionRequest { temporal.api.workflow.v1.VersioningOverride versioning_override = 25; // Priority metadata temporal.api.common.v1.Priority priority = 26; + // Time skipping configuration. If not set, automatic time-skipping is disabled. + temporal.api.workflow.v1.TimeSkippingConfig time_skipping_config = 27; } message SignalWithStartWorkflowExecutionResponse { From 858f4cccb5f16878a7fa8a4619801ef5f30c4212 Mon Sep 17 00:00:00 2001 From: Feiyang Xie Date: Tue, 24 Mar 2026 23:36:58 -0700 Subject: [PATCH 2/6] add fine-grained control to automatic timeskipping --- openapi/openapiv2.json | 38 +++++++++++++-- openapi/openapiv3.yaml | 48 ++++++++++++++++--- temporal/api/history/v1/message.proto | 17 +++++-- temporal/api/workflow/v1/message.proto | 45 ++++++++++++----- .../workflowservice/v1/request_response.proto | 2 +- 5 files changed, 122 insertions(+), 28 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index e663563cf..801956fe7 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -16299,10 +16299,28 @@ "properties": { "enabled": { "type": "boolean", - "description": "If set, enables automatic time-skipping for this workflow execution.\nIt can also be disabled by setting this field to false.\nSpecial attention for transitively related workflows:\n- By default, Child workflows and Continue-As-New workflows will \ninherit the enabled config but only at the time they are started.\n- But if the enabled config is flipped after a child/continue-as-new workflow is started, \nthe propagation won't happen. It not recommended flip the parent's enabled config\nwhen there are in-flight child/continue-as-new workflows." + "description": "Enables or disables automatic time skipping for this workflow execution.\nBy default, this field is propagated to child workflows at the time they are started.\nChanges made after a child workflow has started are not propagated." + }, + "disablePropagation": { + "type": "boolean", + "description": "If set, the enabled field is not propagated to child workflows." + }, + "maxSkippedDuration": { + "type": "string", + "description": "Maximum total virtual time that can be skipped." + }, + "maxElapsedDuration": { + "type": "string", + "format": "date-time", + "description": "Maximum elapsed time since time skipping was enabled.\nThis includes both skipped time and real time elapsing." + }, + "maxTargetTime": { + "type": "string", + "format": "date-time", + "description": "Absolute virtual timestamp at which time skipping is disabled.\nTime skipping will not advance beyond this point." } }, - "description": "Configuration for automatic time skipping on a workflow execution.\nOnce enabled, time automatically advances when there is no in-flight \nactivities, child workflows, or Nexus operations." + "description": "Configuration for automatic time skipping during a workflow execution.\nWhen enabled, virtual time advances automatically whenever there are\nno in-flight activities, child workflows, or Nexus operations." }, "v1TimeoutFailureInfo": { "type": "object", @@ -17871,12 +17889,22 @@ "v1WorkflowExecutionTimeSkippedEventAttributes": { "type": "object", "properties": { - "toTime": { + "targetTime": { "type": "string", - "format": "date-time" + "format": "date-time", + "description": "The virtual time after time skipping is applied." + }, + "disabledAfterBound": { + "type": "boolean", + "description": "when true, automatic time-skipping was enabled with a bound\nand now that bound has been reached and time-skipping is disabled automatically." + }, + "wallClockTime": { + "type": "string", + "format": "date-time", + "description": "The wall-clock time when the time-skipping event happened." } }, - "description": "Attributes for an event marking that a duration was skipped for a workflow execution,\neither via manual time-skipping api call or automatic time-skipping." + "description": "Attributes for an event indicating that virtual time was advanced for a workflow execution,\neither via a manual time-skipping API call or automatic time skipping." }, "v1WorkflowExecutionTimedOutEventAttributes": { "type": "object", diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index ea72e3662..8c0298298 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -14455,8 +14455,33 @@ components: properties: enabled: type: boolean - description: "If set, enables automatic time-skipping for this workflow execution.\n It can also be disabled by setting this field to false.\n Special attention for transitively related workflows:\n - By default, Child workflows and Continue-As-New workflows will \n inherit the enabled config but only at the time they are started.\n - But if the enabled config is flipped after a child/continue-as-new workflow is started, \n the propagation won't happen. It not recommended flip the parent's enabled config\n when there are in-flight child/continue-as-new workflows." - description: "Configuration for automatic time skipping on a workflow execution.\n Once enabled, time automatically advances when there is no in-flight \n activities, child workflows, or Nexus operations." + description: |- + Enables or disables automatic time skipping for this workflow execution. + By default, this field is propagated to child workflows at the time they are started. + Changes made after a child workflow has started are not propagated. + disablePropagation: + type: boolean + description: If set, the enabled field is not propagated to child workflows. + maxSkippedDuration: + pattern: ^-?(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,9})?s$ + type: string + description: Maximum total virtual time that can be skipped. + maxElapsedDuration: + type: string + description: |- + Maximum elapsed time since time skipping was enabled. + This includes both skipped time and real time elapsing. + format: date-time + maxTargetTime: + type: string + description: |- + Absolute virtual timestamp at which time skipping is disabled. + Time skipping will not advance beyond this point. + format: date-time + description: |- + Configuration for automatic time skipping during a workflow execution. + When enabled, virtual time advances automatically whenever there are + no in-flight activities, child workflows, or Nexus operations. TimeoutFailureInfo: type: object properties: @@ -16655,15 +16680,24 @@ components: WorkflowExecutionTimeSkippedEventAttributes: type: object properties: - toTime: + targetTime: type: string + description: The virtual time after time skipping is applied. + format: date-time + disabledAfterBound: + type: boolean description: |- - (-- api-linter: core::0140::prepositions=disabled - aip.dev/not-precedent: "to" is used to indicate target time point. --) + when true, automatic time-skipping was enabled with a bound + and now that bound has been reached and time-skipping is disabled automatically. + (-- api-linter: core::0140::prepositions=disabled + aip.dev/not-precedent: "after" is used to indicate temporal ordering. --) + wallClockTime: + type: string + description: The wall-clock time when the time-skipping event happened. format: date-time description: |- - Attributes for an event marking that a duration was skipped for a workflow execution, - either via manual time-skipping api call or automatic time-skipping. + Attributes for an event indicating that virtual time was advanced for a workflow execution, + either via a manual time-skipping API call or automatic time skipping. WorkflowExecutionTimedOutEventAttributes: type: object properties: diff --git a/temporal/api/history/v1/message.proto b/temporal/api/history/v1/message.proto index 78c05c7dc..82d75510a 100644 --- a/temporal/api/history/v1/message.proto +++ b/temporal/api/history/v1/message.proto @@ -968,12 +968,21 @@ message WorkflowExecutionUnpausedEventAttributes { string request_id = 3; } -// Attributes for an event marking that a duration was skipped for a workflow execution, -// either via manual time-skipping api call or automatic time-skipping. +// Attributes for an event indicating that virtual time was advanced for a workflow execution, +// either via a manual time-skipping API call or automatic time skipping. message WorkflowExecutionTimeSkippedEventAttributes { + + // The virtual time after time skipping is applied. + google.protobuf.Timestamp target_time = 1; + + // when true, automatic time-skipping was enabled with a bound + // and now that bound has been reached and time-skipping is disabled automatically. // (-- api-linter: core::0140::prepositions=disabled - // aip.dev/not-precedent: "to" is used to indicate target time point. --) - google.protobuf.Timestamp to_time = 1; + // aip.dev/not-precedent: "after" is used to indicate temporal ordering. --) + bool disabled_after_bound = 2; + + // The wall-clock time when the time-skipping event happened. + google.protobuf.Timestamp wall_clock_time = 3; } // Event marking that an operation was scheduled by a workflow via the ScheduleNexusOperation command. diff --git a/temporal/api/workflow/v1/message.proto b/temporal/api/workflow/v1/message.proto index e34aaa444..8644d5776 100644 --- a/temporal/api/workflow/v1/message.proto +++ b/temporal/api/workflow/v1/message.proto @@ -573,21 +573,44 @@ message WorkflowExecutionOptions { TimeSkippingConfig time_skipping_config = 3; } -// Configuration for automatic time skipping on a workflow execution. -// Once enabled, time automatically advances when there is no in-flight -// activities, child workflows, or Nexus operations. +// Configuration for automatic time skipping during a workflow execution. +// When enabled, virtual time advances automatically whenever there are +// no in-flight activities, child workflows, or Nexus operations. message TimeSkippingConfig { - // If set, enables automatic time-skipping for this workflow execution. - // It can also be disabled by setting this field to false. - // Special attention for transitively related workflows: - // - By default, Child workflows and Continue-As-New workflows will - // inherit the enabled config but only at the time they are started. - // - But if the enabled config is flipped after a child/continue-as-new workflow is started, - // the propagation won't happen. It not recommended flip the parent's enabled config - // when there are in-flight child/continue-as-new workflows. + // Enables or disables automatic time skipping for this workflow execution. + // By default, this field is propagated to child workflows at the time they are started. + // Changes made after a child workflow has started are not propagated. bool enabled = 1; + // If set, the enabled field is not propagated to child workflows. + bool disable_propagation = 2; + + // Optional bound that limits how long time skipping remains active. + // Once the bound is reached, time skipping is automatically disabled. + // It can later be re-enabled via UpdateWorkflowExecutionOptions. + // + // This is particularly useful in testing scenarios where workflows + // are expected to receive signals, updates, or other events while + // timers are in progress. + // + // This bound is not propagated to child workflows. + // It is recommended to set disable_propagation to true + // and configure TimeSkippingConfig explicitly in child workflows. + oneof bound { + + // Maximum total virtual time that can be skipped. + google.protobuf.Duration max_skipped_duration = 4; + + // Maximum elapsed time since time skipping was enabled. + // This includes both skipped time and real time elapsing. + // (-- api-linter: core::0142::time-field-names=disabled --) + google.protobuf.Timestamp max_elapsed_duration = 5; + + // Absolute virtual timestamp at which time skipping is disabled. + // Time skipping will not advance beyond this point. + google.protobuf.Timestamp max_target_time = 6; + } } // Used to override the versioning behavior (and pinned deployment version, if applicable) of a diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index 0bc279fcb..c98d2d912 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -2959,4 +2959,4 @@ message DeleteActivityExecutionRequest { } message DeleteActivityExecutionResponse { -} +} \ No newline at end of file From a31e53a4110e46a5de51b7c871fb5d538fa444a7 Mon Sep 17 00:00:00 2001 From: Feiyang Xie Date: Wed, 1 Apr 2026 10:49:28 -0700 Subject: [PATCH 3/6] refine time-skipping related comments and fields --- openapi/openapiv2.json | 3 +-- openapi/openapiv3.yaml | 3 ++- temporal/api/history/v1/message.proto | 1 + temporal/api/workflow/v1/message.proto | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index 801956fe7..f9a59edee 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -13043,7 +13043,7 @@ }, "workerMayIgnore": { "type": "boolean", - "description": "Set to true when the SDK may ignore the event as it does not impact workflow state or\ninformation in any way that the SDK need be concerned with. If an SDK encounters an event\ntype which it does not understand, it must error unless this is true. If it is true, it's\nacceptable for the event type and/or attributes to be uninterpretable." + "description": "Set to true when the SDK may ignore the event as it does not impact workflow state or\ninformation in any way that the SDK need be concerned with. If an SDK encounters an event\ntype which it does not understand, it must error unless this is true. If it is true, it's\nacceptable for the event type and/or attributes to be uninterpretable.\nAlways set to true for `WORKFLOW_EXECUTION_TIME_SKIPPED` events." }, "userMetadata": { "$ref": "#/definitions/v1UserMetadata", @@ -16311,7 +16311,6 @@ }, "maxElapsedDuration": { "type": "string", - "format": "date-time", "description": "Maximum elapsed time since time skipping was enabled.\nThis includes both skipped time and real time elapsing." }, "maxTargetTime": { diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index 8c0298298..99d6953b2 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -10177,6 +10177,7 @@ components: information in any way that the SDK need be concerned with. If an SDK encounters an event type which it does not understand, it must error unless this is true. If it is true, it's acceptable for the event type and/or attributes to be uninterpretable. + Always set to true for `WORKFLOW_EXECUTION_TIME_SKIPPED` events. userMetadata: allOf: - $ref: '#/components/schemas/UserMetadata' @@ -14467,11 +14468,11 @@ components: type: string description: Maximum total virtual time that can be skipped. maxElapsedDuration: + pattern: ^-?(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,9})?s$ type: string description: |- Maximum elapsed time since time skipping was enabled. This includes both skipped time and real time elapsing. - format: date-time maxTargetTime: type: string description: |- diff --git a/temporal/api/history/v1/message.proto b/temporal/api/history/v1/message.proto index 82d75510a..54fb8087c 100644 --- a/temporal/api/history/v1/message.proto +++ b/temporal/api/history/v1/message.proto @@ -1146,6 +1146,7 @@ message HistoryEvent { // information in any way that the SDK need be concerned with. If an SDK encounters an event // type which it does not understand, it must error unless this is true. If it is true, it's // acceptable for the event type and/or attributes to be uninterpretable. + // Always set to true for `WORKFLOW_EXECUTION_TIME_SKIPPED` events. bool worker_may_ignore = 300; // Metadata on the event. This is often carried over from commands and client calls. Most events // won't have this information, and how this information is used is dependent upon the interface diff --git a/temporal/api/workflow/v1/message.proto b/temporal/api/workflow/v1/message.proto index 8644d5776..bc29b842f 100644 --- a/temporal/api/workflow/v1/message.proto +++ b/temporal/api/workflow/v1/message.proto @@ -605,7 +605,7 @@ message TimeSkippingConfig { // Maximum elapsed time since time skipping was enabled. // This includes both skipped time and real time elapsing. // (-- api-linter: core::0142::time-field-names=disabled --) - google.protobuf.Timestamp max_elapsed_duration = 5; + google.protobuf.Duration max_elapsed_duration = 5; // Absolute virtual timestamp at which time skipping is disabled. // Time skipping will not advance beyond this point. From 53141165d6efe51a55ad127be491f594f078ac9e Mon Sep 17 00:00:00 2001 From: Feiyang Xie Date: Wed, 1 Apr 2026 13:37:05 -0700 Subject: [PATCH 4/6] refine comments for time-skipping --- openapi/openapiv2.json | 4 ++-- openapi/openapiv3.yaml | 2 +- temporal/api/history/v1/message.proto | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index f9a59edee..19b4ccb33 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -13043,7 +13043,7 @@ }, "workerMayIgnore": { "type": "boolean", - "description": "Set to true when the SDK may ignore the event as it does not impact workflow state or\ninformation in any way that the SDK need be concerned with. If an SDK encounters an event\ntype which it does not understand, it must error unless this is true. If it is true, it's\nacceptable for the event type and/or attributes to be uninterpretable.\nAlways set to true for `WORKFLOW_EXECUTION_TIME_SKIPPED` events." + "description": "Set to true when the SDK may ignore the event as it does not impact workflow state or\ninformation in any way that the SDK need be concerned with. If an SDK encounters an event\ntype which it does not understand, it must error unless this is true. If it is true, it's\nacceptable for the event type and/or attributes to be uninterpretable." }, "userMetadata": { "$ref": "#/definitions/v1UserMetadata", @@ -17903,7 +17903,7 @@ "description": "The wall-clock time when the time-skipping event happened." } }, - "description": "Attributes for an event indicating that virtual time was advanced for a workflow execution,\neither via a manual time-skipping API call or automatic time skipping." + "description": "Attributes for an event indicating that virtual time was advanced for a workflow execution,\neither via a manual time-skipping API call or automatic time skipping.\nThe worker_may_ignore field in HistoryEvent should always be set true for this event." }, "v1WorkflowExecutionTimedOutEventAttributes": { "type": "object", diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index 99d6953b2..ee0ac2bbb 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -10177,7 +10177,6 @@ components: information in any way that the SDK need be concerned with. If an SDK encounters an event type which it does not understand, it must error unless this is true. If it is true, it's acceptable for the event type and/or attributes to be uninterpretable. - Always set to true for `WORKFLOW_EXECUTION_TIME_SKIPPED` events. userMetadata: allOf: - $ref: '#/components/schemas/UserMetadata' @@ -16699,6 +16698,7 @@ components: description: |- Attributes for an event indicating that virtual time was advanced for a workflow execution, either via a manual time-skipping API call or automatic time skipping. + The worker_may_ignore field in HistoryEvent should always be set true for this event. WorkflowExecutionTimedOutEventAttributes: type: object properties: diff --git a/temporal/api/history/v1/message.proto b/temporal/api/history/v1/message.proto index 54fb8087c..e04a37ff7 100644 --- a/temporal/api/history/v1/message.proto +++ b/temporal/api/history/v1/message.proto @@ -970,6 +970,7 @@ message WorkflowExecutionUnpausedEventAttributes { // Attributes for an event indicating that virtual time was advanced for a workflow execution, // either via a manual time-skipping API call or automatic time skipping. +// The worker_may_ignore field in HistoryEvent should always be set true for this event. message WorkflowExecutionTimeSkippedEventAttributes { // The virtual time after time skipping is applied. @@ -1146,7 +1147,6 @@ message HistoryEvent { // information in any way that the SDK need be concerned with. If an SDK encounters an event // type which it does not understand, it must error unless this is true. If it is true, it's // acceptable for the event type and/or attributes to be uninterpretable. - // Always set to true for `WORKFLOW_EXECUTION_TIME_SKIPPED` events. bool worker_may_ignore = 300; // Metadata on the event. This is often carried over from commands and client calls. Most events // won't have this information, and how this information is used is dependent upon the interface From cabd8eef73903175d4672a1d26d0444ecd4f8ba2 Mon Sep 17 00:00:00 2001 From: Feiyang Xie Date: Wed, 1 Apr 2026 20:13:13 -0700 Subject: [PATCH 5/6] refine comments of TimeSkippingConfig --- openapi/openapiv2.json | 4 ++-- openapi/openapiv3.yaml | 7 ++----- temporal/api/workflow/v1/message.proto | 14 ++++++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index 19b4ccb33..cdfb7fd52 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -16299,11 +16299,11 @@ "properties": { "enabled": { "type": "boolean", - "description": "Enables or disables automatic time skipping for this workflow execution.\nBy default, this field is propagated to child workflows at the time they are started.\nChanges made after a child workflow has started are not propagated." + "description": "Enables or disables automatic time skipping for this workflow execution.\nBy default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) \nat the time they are started.\nChanges made after a transitively related workflow has started are not propagated." }, "disablePropagation": { "type": "boolean", - "description": "If set, the enabled field is not propagated to child workflows." + "description": "If set, the enabled field is not propagated to transitively related workflows." }, "maxSkippedDuration": { "type": "string", diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index ee0ac2bbb..e239c1f3c 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -14455,13 +14455,10 @@ components: properties: enabled: type: boolean - description: |- - Enables or disables automatic time skipping for this workflow execution. - By default, this field is propagated to child workflows at the time they are started. - Changes made after a child workflow has started are not propagated. + description: "Enables or disables automatic time skipping for this workflow execution.\n By default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) \n at the time they are started.\n Changes made after a transitively related workflow has started are not propagated." disablePropagation: type: boolean - description: If set, the enabled field is not propagated to child workflows. + description: If set, the enabled field is not propagated to transitively related workflows. maxSkippedDuration: pattern: ^-?(?:0|[1-9][0-9]{0,11})(?:\.[0-9]{1,9})?s$ type: string diff --git a/temporal/api/workflow/v1/message.proto b/temporal/api/workflow/v1/message.proto index bc29b842f..f09518131 100644 --- a/temporal/api/workflow/v1/message.proto +++ b/temporal/api/workflow/v1/message.proto @@ -579,11 +579,12 @@ message WorkflowExecutionOptions { message TimeSkippingConfig { // Enables or disables automatic time skipping for this workflow execution. - // By default, this field is propagated to child workflows at the time they are started. - // Changes made after a child workflow has started are not propagated. + // By default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) + // at the time they are started. + // Changes made after a transitively related workflow has started are not propagated. bool enabled = 1; - // If set, the enabled field is not propagated to child workflows. + // If set, the enabled field is not propagated to transitively related workflows. bool disable_propagation = 2; // Optional bound that limits how long time skipping remains active. @@ -594,9 +595,10 @@ message TimeSkippingConfig { // are expected to receive signals, updates, or other events while // timers are in progress. // - // This bound is not propagated to child workflows. - // It is recommended to set disable_propagation to true - // and configure TimeSkippingConfig explicitly in child workflows. + // This bound is not propagated to transitively related workflows. + // When bound is also needed for transitively related workflows, + // it is recommended to set disable_propagation to true + // and configure TimeSkippingConfig explicitly for transitively related workflows. oneof bound { // Maximum total virtual time that can be skipped. From 9da7862e3922e22c58b00bd1df586e0c76f35c05 Mon Sep 17 00:00:00 2001 From: Feiyang Xie Date: Thu, 2 Apr 2026 18:23:09 -0700 Subject: [PATCH 6/6] add detailed explanation of in-flight work which will impact time-skipping, and change event name --- openapi/openapiv2.json | 28 ++++++------- openapi/openapiv3.yaml | 42 ++++++++++--------- temporal/api/enums/v1/event_type.proto | 4 +- temporal/api/history/v1/message.proto | 18 ++++---- temporal/api/workflow/v1/message.proto | 11 +++-- .../workflowservice/v1/request_response.proto | 6 +-- 6 files changed, 56 insertions(+), 53 deletions(-) diff --git a/openapi/openapiv2.json b/openapi/openapiv2.json index cdfb7fd52..9210d71f3 100644 --- a/openapi/openapiv2.json +++ b/openapi/openapiv2.json @@ -9882,7 +9882,7 @@ }, "timeSkippingConfig": { "$ref": "#/definitions/v1TimeSkippingConfig", - "description": "Time skipping configuration. If not set, automatic time-skipping is disabled." + "description": "Time-skipping configuration. If not set, time skipping is disabled." } } }, @@ -10162,7 +10162,7 @@ }, "timeSkippingConfig": { "$ref": "#/definitions/v1TimeSkippingConfig", - "description": "Automatic time-skipping configuration. If not set, automatic time-skipping is disabled." + "description": "Time-skipping configuration. If not set, time skipping is disabled." } } }, @@ -12636,10 +12636,10 @@ "EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED", "EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED", "EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED", - "EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED" + "EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED" ], "default": "EVENT_TYPE_UNSPECIFIED", - "description": "- EVENT_TYPE_UNSPECIFIED: Place holder and should never appear in a Workflow execution history\n - EVENT_TYPE_WORKFLOW_EXECUTION_STARTED: Workflow execution has been triggered/started\nIt contains Workflow execution inputs, as well as Workflow timeout configurations\n - EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: Workflow execution has successfully completed and contains Workflow execution results\n - EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: Workflow execution has unsuccessfully completed and contains the Workflow execution error\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: Workflow execution has timed out by the Temporal Server\nUsually due to the Workflow having not been completed within timeout settings\n - EVENT_TYPE_WORKFLOW_TASK_SCHEDULED: Workflow Task has been scheduled and the SDK client should now be able to process any new history events\n - EVENT_TYPE_WORKFLOW_TASK_STARTED: Workflow Task has started and the SDK client has picked up the Workflow Task and is processing new history events\n - EVENT_TYPE_WORKFLOW_TASK_COMPLETED: Workflow Task has completed\nThe SDK client picked up the Workflow Task and processed new history events\nSDK client may or may not ask the Temporal Server to do additional work, such as:\nEVENT_TYPE_ACTIVITY_TASK_SCHEDULED\nEVENT_TYPE_TIMER_STARTED\nEVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\nEVENT_TYPE_MARKER_RECORDED\nEVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\nEVENT_TYPE_WORKFLOW_EXECUTION_FAILED\nEVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\nEVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW\n - EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT: Workflow Task encountered a timeout\nEither an SDK client with a local cache was not available at the time, or it took too long for the SDK client to process the task\n - EVENT_TYPE_WORKFLOW_TASK_FAILED: Workflow Task encountered a failure\nUsually this means that the Workflow was non-deterministic\nHowever, the Workflow reset functionality also uses this event\n - EVENT_TYPE_ACTIVITY_TASK_SCHEDULED: Activity Task was scheduled\nThe SDK client should pick up this activity task and execute\nThis event type contains activity inputs, as well as activity timeout configurations\n - EVENT_TYPE_ACTIVITY_TASK_STARTED: Activity Task has started executing\nThe SDK client has picked up the Activity Task and is processing the Activity invocation\n - EVENT_TYPE_ACTIVITY_TASK_COMPLETED: Activity Task has finished successfully\nThe SDK client has picked up and successfully completed the Activity Task\nThis event type contains Activity execution results\n - EVENT_TYPE_ACTIVITY_TASK_FAILED: Activity Task has finished unsuccessfully\nThe SDK picked up the Activity Task but unsuccessfully completed it\nThis event type contains Activity execution errors\n - EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT: Activity has timed out according to the Temporal Server\nActivity did not complete within the timeout settings\n - EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED: A request to cancel the Activity has occurred\nThe SDK client will be able to confirm cancellation of an Activity during an Activity heartbeat\n - EVENT_TYPE_ACTIVITY_TASK_CANCELED: Activity has been cancelled\n - EVENT_TYPE_TIMER_STARTED: A timer has started\n - EVENT_TYPE_TIMER_FIRED: A timer has fired\n - EVENT_TYPE_TIMER_CANCELED: A time has been cancelled\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED: A request has been made to cancel the Workflow execution\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: SDK client has confirmed the cancellation request and the Workflow execution has been cancelled\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Workflow has requested that the Temporal Server try to cancel another Workflow\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server could not cancel the targeted Workflow\nThis is usually because the target Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED: Temporal Server has successfully requested the cancellation of the target Workflow\n - EVENT_TYPE_MARKER_RECORDED: A marker has been recorded.\nThis event type is transparent to the Temporal Server\nThe Server will only store it and will not try to understand it.\n - EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED: Workflow has received a Signal event\nThe event type contains the Signal name, as well as a Signal payload\n - EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: Workflow execution has been forcefully terminated\nThis is usually because the terminate Workflow API was called\n - EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: Workflow has successfully completed and a new Workflow has been started within the same transaction\nContains last Workflow execution results as well as new Workflow execution inputs\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to start a child Workflow\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution cannot be started/triggered\nUsually due to a child Workflow ID collision\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED: Child Workflow execution has successfully started/triggered\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED: Child Workflow execution has successfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution has unsuccessfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED: Child Workflow execution has been cancelled\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TIMED_OUT: Child Workflow execution has timed out by the Temporal Server\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TERMINATED: Child Workflow execution has been terminated\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to Signal the targeted Workflow\nContains the Signal name, as well as a Signal payload\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server cannot Signal the targeted Workflow\nUsually because the Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED: Temporal Server has successfully Signaled the targeted Workflow\n - EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES: Workflow search attributes should be updated and synchronized with the visibility store\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ADMITTED: An update was admitted. Note that not all admitted updates result in this\nevent. See UpdateAdmittedEventOrigin for situations in which this event\nis created.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED: An update was accepted (i.e. passed validation, perhaps because no validator was defined)\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_REJECTED: This event is never written to history.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED: An update completed\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of the workflow as a whole have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_ACTIVITY_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of an already-scheduled activity have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED: Workflow properties modified by user workflow code\n - EVENT_TYPE_NEXUS_OPERATION_SCHEDULED: A Nexus operation was scheduled using a ScheduleNexusOperation command.\n - EVENT_TYPE_NEXUS_OPERATION_STARTED: An asynchronous Nexus operation was started by a Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_COMPLETED: A Nexus operation completed successfully.\n - EVENT_TYPE_NEXUS_OPERATION_FAILED: A Nexus operation failed.\n - EVENT_TYPE_NEXUS_OPERATION_CANCELED: A Nexus operation completed as canceled.\n - EVENT_TYPE_NEXUS_OPERATION_TIMED_OUT: A Nexus operation timed out.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUESTED: A Nexus operation was requested to be canceled using a RequestCancelNexusOperation command.\n - EVENT_TYPE_WORKFLOW_EXECUTION_OPTIONS_UPDATED: Workflow execution options updated by user.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_COMPLETED: A cancellation request for a Nexus operation was successfully delivered to the Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED: A cancellation request for a Nexus operation resulted in an error.\n - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED: An event that indicates that the workflow execution has been paused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: An event that indicates that the previously paused workflow execution has been unpaused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED: An event that indicates that some duration was skipped for this workflow execution.", + "description": "- EVENT_TYPE_UNSPECIFIED: Place holder and should never appear in a Workflow execution history\n - EVENT_TYPE_WORKFLOW_EXECUTION_STARTED: Workflow execution has been triggered/started\nIt contains Workflow execution inputs, as well as Workflow timeout configurations\n - EVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED: Workflow execution has successfully completed and contains Workflow execution results\n - EVENT_TYPE_WORKFLOW_EXECUTION_FAILED: Workflow execution has unsuccessfully completed and contains the Workflow execution error\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIMED_OUT: Workflow execution has timed out by the Temporal Server\nUsually due to the Workflow having not been completed within timeout settings\n - EVENT_TYPE_WORKFLOW_TASK_SCHEDULED: Workflow Task has been scheduled and the SDK client should now be able to process any new history events\n - EVENT_TYPE_WORKFLOW_TASK_STARTED: Workflow Task has started and the SDK client has picked up the Workflow Task and is processing new history events\n - EVENT_TYPE_WORKFLOW_TASK_COMPLETED: Workflow Task has completed\nThe SDK client picked up the Workflow Task and processed new history events\nSDK client may or may not ask the Temporal Server to do additional work, such as:\nEVENT_TYPE_ACTIVITY_TASK_SCHEDULED\nEVENT_TYPE_TIMER_STARTED\nEVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES\nEVENT_TYPE_MARKER_RECORDED\nEVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED\nEVENT_TYPE_WORKFLOW_EXECUTION_COMPLETED\nEVENT_TYPE_WORKFLOW_EXECUTION_FAILED\nEVENT_TYPE_WORKFLOW_EXECUTION_CANCELED\nEVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW\n - EVENT_TYPE_WORKFLOW_TASK_TIMED_OUT: Workflow Task encountered a timeout\nEither an SDK client with a local cache was not available at the time, or it took too long for the SDK client to process the task\n - EVENT_TYPE_WORKFLOW_TASK_FAILED: Workflow Task encountered a failure\nUsually this means that the Workflow was non-deterministic\nHowever, the Workflow reset functionality also uses this event\n - EVENT_TYPE_ACTIVITY_TASK_SCHEDULED: Activity Task was scheduled\nThe SDK client should pick up this activity task and execute\nThis event type contains activity inputs, as well as activity timeout configurations\n - EVENT_TYPE_ACTIVITY_TASK_STARTED: Activity Task has started executing\nThe SDK client has picked up the Activity Task and is processing the Activity invocation\n - EVENT_TYPE_ACTIVITY_TASK_COMPLETED: Activity Task has finished successfully\nThe SDK client has picked up and successfully completed the Activity Task\nThis event type contains Activity execution results\n - EVENT_TYPE_ACTIVITY_TASK_FAILED: Activity Task has finished unsuccessfully\nThe SDK picked up the Activity Task but unsuccessfully completed it\nThis event type contains Activity execution errors\n - EVENT_TYPE_ACTIVITY_TASK_TIMED_OUT: Activity has timed out according to the Temporal Server\nActivity did not complete within the timeout settings\n - EVENT_TYPE_ACTIVITY_TASK_CANCEL_REQUESTED: A request to cancel the Activity has occurred\nThe SDK client will be able to confirm cancellation of an Activity during an Activity heartbeat\n - EVENT_TYPE_ACTIVITY_TASK_CANCELED: Activity has been cancelled\n - EVENT_TYPE_TIMER_STARTED: A timer has started\n - EVENT_TYPE_TIMER_FIRED: A timer has fired\n - EVENT_TYPE_TIMER_CANCELED: A time has been cancelled\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCEL_REQUESTED: A request has been made to cancel the Workflow execution\n - EVENT_TYPE_WORKFLOW_EXECUTION_CANCELED: SDK client has confirmed the cancellation request and the Workflow execution has been cancelled\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Workflow has requested that the Temporal Server try to cancel another Workflow\n - EVENT_TYPE_REQUEST_CANCEL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server could not cancel the targeted Workflow\nThis is usually because the target Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_CANCEL_REQUESTED: Temporal Server has successfully requested the cancellation of the target Workflow\n - EVENT_TYPE_MARKER_RECORDED: A marker has been recorded.\nThis event type is transparent to the Temporal Server\nThe Server will only store it and will not try to understand it.\n - EVENT_TYPE_WORKFLOW_EXECUTION_SIGNALED: Workflow has received a Signal event\nThe event type contains the Signal name, as well as a Signal payload\n - EVENT_TYPE_WORKFLOW_EXECUTION_TERMINATED: Workflow execution has been forcefully terminated\nThis is usually because the terminate Workflow API was called\n - EVENT_TYPE_WORKFLOW_EXECUTION_CONTINUED_AS_NEW: Workflow has successfully completed and a new Workflow has been started within the same transaction\nContains last Workflow execution results as well as new Workflow execution inputs\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to start a child Workflow\n - EVENT_TYPE_START_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution cannot be started/triggered\nUsually due to a child Workflow ID collision\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_STARTED: Child Workflow execution has successfully started/triggered\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_COMPLETED: Child Workflow execution has successfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_FAILED: Child Workflow execution has unsuccessfully completed\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_CANCELED: Child Workflow execution has been cancelled\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TIMED_OUT: Child Workflow execution has timed out by the Temporal Server\n - EVENT_TYPE_CHILD_WORKFLOW_EXECUTION_TERMINATED: Child Workflow execution has been terminated\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_INITIATED: Temporal Server will try to Signal the targeted Workflow\nContains the Signal name, as well as a Signal payload\n - EVENT_TYPE_SIGNAL_EXTERNAL_WORKFLOW_EXECUTION_FAILED: Temporal Server cannot Signal the targeted Workflow\nUsually because the Workflow could not be found\n - EVENT_TYPE_EXTERNAL_WORKFLOW_EXECUTION_SIGNALED: Temporal Server has successfully Signaled the targeted Workflow\n - EVENT_TYPE_UPSERT_WORKFLOW_SEARCH_ATTRIBUTES: Workflow search attributes should be updated and synchronized with the visibility store\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ADMITTED: An update was admitted. Note that not all admitted updates result in this\nevent. See UpdateAdmittedEventOrigin for situations in which this event\nis created.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_ACCEPTED: An update was accepted (i.e. passed validation, perhaps because no validator was defined)\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_REJECTED: This event is never written to history.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UPDATE_COMPLETED: An update completed\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of the workflow as a whole have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_ACTIVITY_PROPERTIES_MODIFIED_EXTERNALLY: Some property or properties of an already-scheduled activity have changed by non-workflow code.\nThe distinction of external vs. command-based modification is important so the SDK can\nmaintain determinism when using the command-based approach.\n - EVENT_TYPE_WORKFLOW_PROPERTIES_MODIFIED: Workflow properties modified by user workflow code\n - EVENT_TYPE_NEXUS_OPERATION_SCHEDULED: A Nexus operation was scheduled using a ScheduleNexusOperation command.\n - EVENT_TYPE_NEXUS_OPERATION_STARTED: An asynchronous Nexus operation was started by a Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_COMPLETED: A Nexus operation completed successfully.\n - EVENT_TYPE_NEXUS_OPERATION_FAILED: A Nexus operation failed.\n - EVENT_TYPE_NEXUS_OPERATION_CANCELED: A Nexus operation completed as canceled.\n - EVENT_TYPE_NEXUS_OPERATION_TIMED_OUT: A Nexus operation timed out.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUESTED: A Nexus operation was requested to be canceled using a RequestCancelNexusOperation command.\n - EVENT_TYPE_WORKFLOW_EXECUTION_OPTIONS_UPDATED: Workflow execution options updated by user.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_COMPLETED: A cancellation request for a Nexus operation was successfully delivered to the Nexus handler.\n - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED: A cancellation request for a Nexus operation resulted in an error.\n - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED: An event that indicates that the workflow execution has been paused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED: An event that indicates that the previously paused workflow execution has been unpaused.\n - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED: An event that indicates time skipping advanced time or was disabled automatically after a bound was reached.", "title": "Whenever this list of events is changed do change the function shouldBufferEvent in mutableStateBuilder.go to make sure to do the correct event ordering" }, "v1ExternalWorkflowExecutionCancelRequestedEventAttributes": { @@ -13238,8 +13238,8 @@ "workflowExecutionUnpausedEventAttributes": { "$ref": "#/definitions/v1WorkflowExecutionUnpausedEventAttributes" }, - "workflowExecutionTimeSkippedEventAttributes": { - "$ref": "#/definitions/v1WorkflowExecutionTimeSkippedEventAttributes" + "workflowExecutionTimeSkippingStateChangedEventAttributes": { + "$ref": "#/definitions/v1WorkflowExecutionTimeSkippingStateChangedEventAttributes" } }, "description": "History events are the method by which Temporal SDKs advance (or recreate) workflow state.\nSee the `EventType` enum for more info about what each event is for." @@ -16299,7 +16299,7 @@ "properties": { "enabled": { "type": "boolean", - "description": "Enables or disables automatic time skipping for this workflow execution.\nBy default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) \nat the time they are started.\nChanges made after a transitively related workflow has started are not propagated." + "description": "Enables or disables time skipping for this workflow execution.\nBy default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) \nat the time they are started.\nChanges made after a transitively related workflow has started are not propagated." }, "disablePropagation": { "type": "boolean", @@ -16319,7 +16319,7 @@ "description": "Absolute virtual timestamp at which time skipping is disabled.\nTime skipping will not advance beyond this point." } }, - "description": "Configuration for automatic time skipping during a workflow execution.\nWhen enabled, virtual time advances automatically whenever there are\nno in-flight activities, child workflows, or Nexus operations." + "description": "Configuration for time skipping during a workflow execution.\nWhen enabled, virtual time advances automatically whenever there is no in-flight work.\nIn-flight work includes activities, child workflows, Nexus operations, signal/cancel external workflow operations,\nand possibly other features added in the future.\nUser timers are not classified as in-flight work and will be skipped over.\nWhen time advances, it skips to the earlier of the next user timer or the configured bound, if either exists." }, "v1TimeoutFailureInfo": { "type": "object", @@ -17624,7 +17624,7 @@ }, "timeSkippingConfig": { "$ref": "#/definitions/v1TimeSkippingConfig", - "description": "Time skipping configuration upserted in this event. \nIt means the time-skipping config is changed, and the full latest config is upserted." + "description": "If set, the time-skipping configuration was changed. Contains the full updated configuration." } } }, @@ -17885,25 +17885,25 @@ } } }, - "v1WorkflowExecutionTimeSkippedEventAttributes": { + "v1WorkflowExecutionTimeSkippingStateChangedEventAttributes": { "type": "object", "properties": { "targetTime": { "type": "string", "format": "date-time", - "description": "The virtual time after time skipping is applied." + "description": "The virtual time after time skipping was applied." }, "disabledAfterBound": { "type": "boolean", - "description": "when true, automatic time-skipping was enabled with a bound\nand now that bound has been reached and time-skipping is disabled automatically." + "description": "when true, time skipping was disabled automatically due to a bound being reached." }, "wallClockTime": { "type": "string", "format": "date-time", - "description": "The wall-clock time when the time-skipping event happened." + "description": "The wall-clock time when the time-skipping state changed event was generated." } }, - "description": "Attributes for an event indicating that virtual time was advanced for a workflow execution,\neither via a manual time-skipping API call or automatic time skipping.\nThe worker_may_ignore field in HistoryEvent should always be set true for this event." + "description": "Attributes for an event indicating that time skipping state changed for a workflow execution,\neither time was advanced or time skipping was disabled automatically due to a bound being reached.\nThe worker_may_ignore field in HistoryEvent should always be set true for this event." }, "v1WorkflowExecutionTimedOutEventAttributes": { "type": "object", diff --git a/openapi/openapiv3.yaml b/openapi/openapiv3.yaml index e239c1f3c..a5e00d331 100644 --- a/openapi/openapiv3.yaml +++ b/openapi/openapiv3.yaml @@ -10157,7 +10157,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED - - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED type: string format: enum version: @@ -10316,8 +10316,8 @@ components: $ref: '#/components/schemas/WorkflowExecutionPausedEventAttributes' workflowExecutionUnpausedEventAttributes: $ref: '#/components/schemas/WorkflowExecutionUnpausedEventAttributes' - workflowExecutionTimeSkippedEventAttributes: - $ref: '#/components/schemas/WorkflowExecutionTimeSkippedEventAttributes' + workflowExecutionTimeSkippingStateChangedEventAttributes: + $ref: '#/components/schemas/WorkflowExecutionTimeSkippingStateChangedEventAttributes' description: |- History events are the method by which Temporal SDKs advance (or recreate) workflow state. See the `EventType` enum for more info about what each event is for. @@ -12263,7 +12263,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED - - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED type: string description: The event type of the history event generated by the request. format: enum @@ -13580,7 +13580,7 @@ components: timeSkippingConfig: allOf: - $ref: '#/components/schemas/TimeSkippingConfig' - description: Time skipping configuration. If not set, automatic time-skipping is disabled. + description: Time-skipping configuration. If not set, time skipping is disabled. SignalWithStartWorkflowExecutionResponse: type: object properties: @@ -14046,7 +14046,7 @@ components: timeSkippingConfig: allOf: - $ref: '#/components/schemas/TimeSkippingConfig' - description: Automatic time-skipping configuration. If not set, automatic time-skipping is disabled. + description: Time-skipping configuration. If not set, time skipping is disabled. StartWorkflowExecutionResponse: type: object properties: @@ -14455,7 +14455,7 @@ components: properties: enabled: type: boolean - description: "Enables or disables automatic time skipping for this workflow execution.\n By default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) \n at the time they are started.\n Changes made after a transitively related workflow has started are not propagated." + description: "Enables or disables time skipping for this workflow execution.\n By default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) \n at the time they are started.\n Changes made after a transitively related workflow has started are not propagated." disablePropagation: type: boolean description: If set, the enabled field is not propagated to transitively related workflows. @@ -14476,9 +14476,12 @@ components: Time skipping will not advance beyond this point. format: date-time description: |- - Configuration for automatic time skipping during a workflow execution. - When enabled, virtual time advances automatically whenever there are - no in-flight activities, child workflows, or Nexus operations. + Configuration for time skipping during a workflow execution. + When enabled, virtual time advances automatically whenever there is no in-flight work. + In-flight work includes activities, child workflows, Nexus operations, signal/cancel external workflow operations, + and possibly other features added in the future. + User timers are not classified as in-flight work and will be skipped over. + When time advances, it skips to the earlier of the next user timer or the configured bound, if either exists. TimeoutFailureInfo: type: object properties: @@ -15909,7 +15912,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED - - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED type: string format: enum description: EventReference is a direct reference to a history event through the event ID. @@ -15980,7 +15983,7 @@ components: - EVENT_TYPE_NEXUS_OPERATION_CANCEL_REQUEST_FAILED - EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED - EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED - - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED + - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED type: string format: enum description: RequestIdReference is a indirect reference to a history event through the request ID. @@ -16368,7 +16371,7 @@ components: timeSkippingConfig: allOf: - $ref: '#/components/schemas/TimeSkippingConfig' - description: "Time skipping configuration upserted in this event. \n It means the time-skipping config is changed, and the full latest config is upserted." + description: If set, the time-skipping configuration was changed. Contains the full updated configuration. WorkflowExecutionPauseInfo: type: object properties: @@ -16674,27 +16677,26 @@ components: identity: type: string description: id of the client who requested termination - WorkflowExecutionTimeSkippedEventAttributes: + WorkflowExecutionTimeSkippingStateChangedEventAttributes: type: object properties: targetTime: type: string - description: The virtual time after time skipping is applied. + description: The virtual time after time skipping was applied. format: date-time disabledAfterBound: type: boolean description: |- - when true, automatic time-skipping was enabled with a bound - and now that bound has been reached and time-skipping is disabled automatically. + when true, time skipping was disabled automatically due to a bound being reached. (-- api-linter: core::0140::prepositions=disabled aip.dev/not-precedent: "after" is used to indicate temporal ordering. --) wallClockTime: type: string - description: The wall-clock time when the time-skipping event happened. + description: The wall-clock time when the time-skipping state changed event was generated. format: date-time description: |- - Attributes for an event indicating that virtual time was advanced for a workflow execution, - either via a manual time-skipping API call or automatic time skipping. + Attributes for an event indicating that time skipping state changed for a workflow execution, + either time was advanced or time skipping was disabled automatically due to a bound being reached. The worker_may_ignore field in HistoryEvent should always be set true for this event. WorkflowExecutionTimedOutEventAttributes: type: object diff --git a/temporal/api/enums/v1/event_type.proto b/temporal/api/enums/v1/event_type.proto index 26e3387d7..16ee20866 100644 --- a/temporal/api/enums/v1/event_type.proto +++ b/temporal/api/enums/v1/event_type.proto @@ -173,6 +173,6 @@ enum EventType { EVENT_TYPE_WORKFLOW_EXECUTION_PAUSED = 58; // An event that indicates that the previously paused workflow execution has been unpaused. EVENT_TYPE_WORKFLOW_EXECUTION_UNPAUSED = 59; - // An event that indicates that some duration was skipped for this workflow execution. - EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPED = 60; + // An event that indicates time skipping advanced time or was disabled automatically after a bound was reached. + EVENT_TYPE_WORKFLOW_EXECUTION_TIME_SKIPPING_STATE_CHANGED = 60; } diff --git a/temporal/api/history/v1/message.proto b/temporal/api/history/v1/message.proto index e04a37ff7..9f273b2fd 100644 --- a/temporal/api/history/v1/message.proto +++ b/temporal/api/history/v1/message.proto @@ -873,8 +873,7 @@ message WorkflowExecutionOptionsUpdatedEventAttributes { // Priority override upserted in this event. Represents the full priority; not just partial fields. // Ignored if nil. temporal.api.common.v1.Priority priority = 6; - // Time skipping configuration upserted in this event. - // It means the time-skipping config is changed, and the full latest config is upserted. + // If set, the time-skipping configuration was changed. Contains the full updated configuration. temporal.api.workflow.v1.TimeSkippingConfig time_skipping_config = 7; } @@ -968,21 +967,20 @@ message WorkflowExecutionUnpausedEventAttributes { string request_id = 3; } -// Attributes for an event indicating that virtual time was advanced for a workflow execution, -// either via a manual time-skipping API call or automatic time skipping. +// Attributes for an event indicating that time skipping state changed for a workflow execution, +// either time was advanced or time skipping was disabled automatically due to a bound being reached. // The worker_may_ignore field in HistoryEvent should always be set true for this event. -message WorkflowExecutionTimeSkippedEventAttributes { +message WorkflowExecutionTimeSkippingStateChangedEventAttributes { - // The virtual time after time skipping is applied. + // The virtual time after time skipping was applied. google.protobuf.Timestamp target_time = 1; - // when true, automatic time-skipping was enabled with a bound - // and now that bound has been reached and time-skipping is disabled automatically. + // when true, time skipping was disabled automatically due to a bound being reached. // (-- api-linter: core::0140::prepositions=disabled // aip.dev/not-precedent: "after" is used to indicate temporal ordering. --) bool disabled_after_bound = 2; - // The wall-clock time when the time-skipping event happened. + // The wall-clock time when the time-skipping state changed event was generated. google.protobuf.Timestamp wall_clock_time = 3; } @@ -1222,7 +1220,7 @@ message HistoryEvent { NexusOperationCancelRequestFailedEventAttributes nexus_operation_cancel_request_failed_event_attributes = 62; WorkflowExecutionPausedEventAttributes workflow_execution_paused_event_attributes = 63; WorkflowExecutionUnpausedEventAttributes workflow_execution_unpaused_event_attributes = 64; - WorkflowExecutionTimeSkippedEventAttributes workflow_execution_time_skipped_event_attributes = 65; + WorkflowExecutionTimeSkippingStateChangedEventAttributes workflow_execution_time_skipping_state_changed_event_attributes = 65; } } diff --git a/temporal/api/workflow/v1/message.proto b/temporal/api/workflow/v1/message.proto index f09518131..656982270 100644 --- a/temporal/api/workflow/v1/message.proto +++ b/temporal/api/workflow/v1/message.proto @@ -573,12 +573,15 @@ message WorkflowExecutionOptions { TimeSkippingConfig time_skipping_config = 3; } -// Configuration for automatic time skipping during a workflow execution. -// When enabled, virtual time advances automatically whenever there are -// no in-flight activities, child workflows, or Nexus operations. +// Configuration for time skipping during a workflow execution. +// When enabled, virtual time advances automatically whenever there is no in-flight work. +// In-flight work includes activities, child workflows, Nexus operations, signal/cancel external workflow operations, +// and possibly other features added in the future. +// User timers are not classified as in-flight work and will be skipped over. +// When time advances, it skips to the earlier of the next user timer or the configured bound, if either exists. message TimeSkippingConfig { - // Enables or disables automatic time skipping for this workflow execution. + // Enables or disables time skipping for this workflow execution. // By default, this field is propagated to transitively related workflows (child workflows/start-as-new/reset) // at the time they are started. // Changes made after a transitively related workflow has started are not propagated. diff --git a/temporal/api/workflowservice/v1/request_response.proto b/temporal/api/workflowservice/v1/request_response.proto index c98d2d912..fb10ea256 100644 --- a/temporal/api/workflowservice/v1/request_response.proto +++ b/temporal/api/workflowservice/v1/request_response.proto @@ -197,7 +197,7 @@ message StartWorkflowExecutionRequest { temporal.api.common.v1.Priority priority = 27; // Deployment Options of the worker who will process the eager task. Passed when `request_eager_execution=true`. temporal.api.deployment.v1.WorkerDeploymentOptions eager_worker_deployment_options = 28; - // Automatic time-skipping configuration. If not set, automatic time-skipping is disabled. + // Time-skipping configuration. If not set, time skipping is disabled. temporal.api.workflow.v1.TimeSkippingConfig time_skipping_config = 29; } @@ -838,7 +838,7 @@ message SignalWithStartWorkflowExecutionRequest { temporal.api.workflow.v1.VersioningOverride versioning_override = 25; // Priority metadata temporal.api.common.v1.Priority priority = 26; - // Time skipping configuration. If not set, automatic time-skipping is disabled. + // Time-skipping configuration. If not set, time skipping is disabled. temporal.api.workflow.v1.TimeSkippingConfig time_skipping_config = 27; } @@ -2959,4 +2959,4 @@ message DeleteActivityExecutionRequest { } message DeleteActivityExecutionResponse { -} \ No newline at end of file +}