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
- Pick a different, resettable BuildId: list the workflow's auto-reset points and choose an earlier version with Resettable=true.
- 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.
- Verify the BuildId string is correct (typo or stale version id leads to unexpected point selection).
- 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
- Always list auto-reset points and check Resettable before issuing a reset.
- Prefer the most recent resettable point when rolling back bad deployments.
- Don't hardcode BuildIds; fetch them from DescribeWorkflowExecution.
- Alert on workflows that mark points non-resettable to catch bad-deploy patterns early.
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
- Reset point for %v is expired
- Reset point for %v points to previous run and CurrentRunOnly
- Can't find reset point for %v
- failed to get workflow execution history
- GetWorkflowExecutionHistory failed
AI-assisted analysis of temporalio/temporal@bde624efd1 (2026-09-01).
Data as JSON: /api/errors/817691c078e70773.
Report an issue: GitHub.