temporalio/temporal · error

Can't find reset point for %v

Error message

Can't find reset point for %v

What it means

getResetPoint iterated all auto-reset points of the workflow execution and none had a BuildId equal to the requested buildId, so no FirstWorkflowTaskCompletedId could be resolved. This means the workflow has no auto-reset point recorded for that worker deployment version.

Source

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

	})
	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. Verify the BuildId exists: describe the workflow execution and inspect GetAutoResetPoints().GetPoints() for an exact match.
  2. Use the correct/complete BuildId string (include the full version identifier as recorded by the worker).
  3. If no point exists for that version, use an alternative recovery: reset by event ID/time, or terminate and restart the workflow.
  4. Enable/verify worker-versioning auto-reset-point recording so future builds are captured.

Example fix

// before
id, err := getResetEventIDByOptions(ctx, exec, &ResetOptions{BuildId: "my-worker@1.2"}) // not recorded
// after
resp, _ := client.DescribeWorkflowExecution(ctx, &workflowservice.DescribeWorkflowExecutionRequest{WorkflowExecution: exec})
for _, p := range resp.GetWorkflowExecutionInfo().GetAutoResetPoints().GetPoints() {
  if p.GetBuildId() == "my-worker@1.2" {
    id, err = getResetEventIDByOptions(ctx, exec, &ResetOptions{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 }
found := false
for _, p := range resp.GetWorkflowExecutionInfo().GetAutoResetPoints().GetPoints() {
  if p.GetBuildId() == buildId { found = true; break }
}
if !found {
  return fmt.Errorf("build %s has no reset point on this workflow", buildId)
}

Type guard

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

Try / catch

if err := doReset(ctx, exec, buildId); err != nil {
  if strings.Contains(err.Error(), "Can't find reset point") {
    logger.Warn("no reset point for build; falling back to terminate/restart")
    return fallbackRecovery(ctx, exec)
  }
  return err
}

Prevention

When it happens

Trigger: Calling getResetEventIDByOptions with a buildId that was never recorded as an auto-reset point for this workflow execution — wrong version string, version deployed but workflow never ran a task on it, or reset points cleared/expired/overwritten by newer deployments (max points limit).

Common situations: Typo in BuildId; resetting a workflow that started after the bad deployment (so no earlier point exists); servers keeping only a bounded number of auto-reset points so older ones were evicted; versioning config not enabled when the workflow ran.

Related errors


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