temporalio/temporal · error

Reset point for %v is not resettable

Error message

Reset point for %v is not resettable

What it means

getResetPoint looks up an auto-reset point by BuildId in the workflow execution's auto-reset points. If the matching point exists but its Resettable flag is false, the reset is refused with this error because Temporal marks bad deployments as non-resettable to prevent resetting into a known-broken state.

Source

Thrown at service/worker/batcher/activities.go:1173

	ctx context.Context,
	namespaceStr string,
	execution *commonpb.WorkflowExecution,
	frontendClient workflowservice.WorkflowServiceClient,
	buildId string,
	currentRunOnly bool,
) (workflowTaskEventID int64, err error) {
	res, err := frontendClient.DescribeWorkflowExecution(ctx, &workflowservice.DescribeWorkflowExecutionRequest{
		Namespace: namespaceStr,
		Execution: execution,
	})
	if err != nil {
		return 0, err
	}
	resetPoints := res.GetWorkflowExecutionInfo().GetAutoResetPoints().GetPoints()
	for _, point := range resetPoints {
		if point.BuildId == buildId {
			if !point.Resettable {
				return 0, fmt.Errorf("Reset point for %v is not resettable", buildId)
			} else if point.ExpireTime != nil && point.ExpireTime.AsTime().Before(time.Now()) {
				return 0, fmt.Errorf("Reset point for %v is expired", buildId)
			} else if execution.RunId != point.RunId && currentRunOnly {
				return 0, fmt.Errorf("Reset point for %v points to previous run and CurrentRunOnly is set", buildId)
			}
			execution.RunId = point.RunId
			return point.FirstWorkflowTaskCompletedId, nil
		}
	}
	return 0, fmt.Errorf("Can't find reset point for %v", buildId)
}

View on GitHub (pinned to bde624efd1)

Solutions

  1. Pick a different, resettable BuildId: list the workflow's auto-reset points and choose an earlier version with Resettable=true.
  2. If the non-resettable point is the one you need, reset to the previous resettable point instead, or use a full workflow termination/restart strategy.
  3. Verify the BuildId string is correct (typo or stale version id leads to unexpected point selection).
  4. Enable the auto-reset-points visibility/config so future bad deployments are recorded resettable before expiry.

Example fix

// before
resp, _ := client.ResetWorkflow(ctx, &workflowservice.ResetWorkflowExecutionRequest{
  WorkflowExecution: exec,
  BuildId: "bad-deploy-v2", // marked non-resettable
})
// after
resp, _ := client.DescribeWorkflowExecution(ctx, &workflowservice.DescribeWorkflowExecutionRequest{WorkflowExecution: exec})
for _, p := range resp.GetWorkflowExecutionInfo().GetAutoResetPoints().GetPoints() {
  if p.GetResettable() {
    _, _ = client.ResetWorkflow(ctx, &workflowservice.ResetWorkflowExecutionRequest{WorkflowExecution: exec, BuildId: p.GetBuildId()})
    break
  }
}
Defensive patterns

Strategy: validation

Validate before calling

resp, err := client.DescribeWorkflowExecution(ctx, &workflowservice.DescribeWorkflowExecutionRequest{WorkflowExecution: exec})
if err != nil { return err }
for _, p := range resp.GetWorkflowExecutionInfo().GetAutoResetPoints().GetPoints() {
  if p.GetBuildId() == buildId {
    if !p.GetResettable() {
      return fmt.Errorf("build %s not resettable; choose another point", buildId)
    }
  }
}

Type guard

func isResettable(points []*deploymentpb.ResetPoint, buildId string) bool {
  for _, p := range points {
    if p.GetBuildId() == buildId {
      return p.GetResettable()
    }
  }
  return false
}

Try / catch

if err := doReset(ctx, exec, buildId); err != nil {
  if strings.Contains(err.Error(), "is not resettable") {
    // fall back to first resettable point
    return resetToFirstResettablePoint(ctx, exec)
  }
  return err
}

Prevention

When it happens

Trigger: Calling a reset batch operation (via getResetEventIDByOptions -> getResetPoint) with a buildId whose corresponding auto-reset point has Resettable=false — typically because a workflow task failure was recorded as unresettable for that deployment version.

Common situations: Attempting to roll back a bad worker deployment after Temporal already flagged that BuildId as not resettable (e.g. the bad version continued to run and was marked by the reset/patching machinery); using the wrong BuildId string for the version you meant to reset.

Related errors


AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01). Data as JSON: /api/errors/817691c078e70773. Report an issue: GitHub.