micro/go-micro · error

flow %s has no checkpoint configured

Error message

flow %s has no checkpoint configured

What it means

Resume restores a persisted run from the flow's checkpoint store. If the Flow was constructed without a Checkpoint option, f.checkpoint is nil and there is nowhere to load the run from, so Resume fails fast with this error. The library requires checkpointing to be configured before any resume operation.

Source

Thrown at flow/steps.go:422

		Started:  time.Now(),
	}
	for _, s := range f.opts.Steps {
		run.Steps = append(run.Steps, StepRecord{Name: s.Name, Status: "pending"})
	}
	return f.runFrom(ctx, run)
}

// Resume continues a persisted run by id, picking up at the step it
// stopped on. Completed runs are a no-op.
func (f *Flow) Resume(ctx context.Context, runID string) error {
	ctx, cancel := f.withTimeout(ctx)
	defer cancel()

	if err := validateSteps(f.opts.Steps); err != nil {
		return err
	}
	if f.checkpoint == nil {
		return fmt.Errorf("flow %s has no checkpoint configured", f.name)
	}
	run, ok, err := f.checkpoint.Load(ctx, runID)
	if err != nil {
		return err
	}
	if !ok {
		return fmt.Errorf("run %s not found", runID)
	}
	if run.Status == "done" {
		return nil
	}
	_, err = f.runFrom(ctx, run)
	return err
}

// ResumePending resumes every checkpointed run for this flow that has not
// completed yet, in the same oldest-first order returned by Pending.
//

View on GitHub (pinned to 24529f1404)

Solutions

  1. Add the flow.Checkpoint(...) option when constructing the Flow, pointing it at a persistent store.
  2. Verify the Flow instance used for Resume is the same one (or configured identically to the one) that started the run.
  3. If checkpointing is intentionally disabled, remove the Resume/ResumePending call path instead of resuming.

Example fix

// before
f := flow.New(flow.Steps(step1, step2))
err := f.Resume(ctx, runID) // fails: no checkpoint

// after
f := flow.New(
  flow.Steps(step1, step2),
  flow.Checkpoint(mystore),
)
err := f.Resume(ctx, runID)
Defensive patterns

Strategy: validation

Validate before calling

if f.checkpoint == nil {
    return errors.New("cannot resume: flow was created without flow.Checkpoint(...)")
}

Try / catch

if err := f.Resume(ctx, runID); err != nil {
    if strings.Contains(err.Error(), "no checkpoint configured") {
        // rebuild flow with checkpoint option, then retry
    }
    return err
}

Prevention

When it happens

Trigger: Calling flow.Resume(ctx, runID) (directly or via ResumePending) on a Flow instance created without flow.Checkpoint(...).

Common situations: A flow works fine for fresh starts (Start doesn't need a checkpoint), so the missing option goes unnoticed until a crash/restart and someone tries to resume; flows created in tests often omit the checkpoint option; ResumePending loops over saved runs but the target flow itself never had a checkpoint configured.

Related errors


AI-assisted analysis of micro/go-micro@24529f1404 (2026-09-01). Data as JSON: /api/errors/aabf69dfdf0aa2ca. Report an issue: GitHub.