Skip to main content

Workflow Checkpoints

Every step gate evaluation automatically creates a checkpoint, capturing the decision and full policy context at that governance boundary. Checkpoints are not arbitrary snapshots: they are governance-aware resume boundaries where the runtime can safely re-evaluate and continue.

How checkpoints work

  1. Your orchestrator calls the step gate API before each step
  2. AxonFlow evaluates policies and records the decision
  3. A checkpoint is created at that boundary with the full context (step name, model, provider, tool context, actor identity)
  4. If the workflow needs to resume later, it can re-evaluate from any checkpoint with current policies

Checkpoints are created automatically. No extra API call or configuration needed.

Listing checkpoints

Available in all tiers (Community, Evaluation, Enterprise):

curl http://localhost:8080/api/v1/workflows/wf_123/checkpoints \
-u "$CLIENT_ID:$CLIENT_SECRET"

Response:

{
"workflow_id": "wf_123",
"checkpoints": [
{
"id": 1,
"step_id": "step-analyze",
"step_index": 1,
"checkpoint_type": "step_gate",
"gate_decision": "allow",
"is_resumable": true,
"resume_count": 0,
"created_at": "2026-04-18T10:00:00Z"
},
{
"id": 2,
"step_id": "step-deploy",
"step_index": 2,
"checkpoint_type": "approval_boundary",
"gate_decision": "require_approval",
"is_resumable": true,
"resume_count": 0,
"created_at": "2026-04-18T10:01:00Z"
}
]
}

Checkpoint types

  • step_gate: standard checkpoint at a step gate evaluation
  • approval_boundary: checkpoint where the step required human approval. These are particularly important for resume because the approval decision may have changed since the checkpoint was created.

Resumable vs non-resumable

Checkpoints for allow and require_approval decisions are resumable. Checkpoints for block decisions are not: there is no point resuming from a hard policy block.

Resuming from checkpoints

Evaluation tier: resume from last checkpoint

curl -X POST http://localhost:8080/api/v1/workflows/wf_123/checkpoints/resume \
-u "$CLIENT_ID:$CLIENT_SECRET"

Enterprise tier: resume from any checkpoint

curl -X POST http://localhost:8080/api/v1/workflows/wf_123/checkpoints/42/resume \
-u "$CLIENT_ID:$CLIENT_SECRET"

Response:

{
"workflow_id": "wf_123",
"resumed_from_checkpoint": "step-deploy",
"resumed_from_index": 2,
"new_decision": "allow",
"decision_source": "fresh",
"resume_count": 1,
"message": "Workflow resumed from checkpoint at step step-deploy (index 2)"
}

Resume always uses retry_policy=reevaluate internally, so the step gate is re-evaluated with current policies. If policies have changed since the checkpoint was created, the new decision reflects that.

SDK usage

# List checkpoints (all tiers)
result = await client.get_checkpoints("wf_123")
for cp in result.checkpoints:
print(f"{cp.step_id}: {cp.gate_decision} (resumable={cp.is_resumable})")

# Resume from specific checkpoint (Enterprise)
result = await client.resume_from_checkpoint("wf_123", checkpoint_id=42)
print(f"New decision: {result.new_decision}")
// List checkpoints (all tiers)
result, _ := client.GetCheckpoints("wf_123")
for _, cp := range result.Checkpoints {
fmt.Printf("%s: %s (resumable=%v)\n", cp.StepID, cp.GateDecision, cp.IsResumable)
}

// Resume from specific checkpoint (Enterprise)
result, _ := client.ResumeFromCheckpoint("wf_123", 42)
fmt.Printf("New decision: %s\n", result.NewDecision)

What checkpoints store

Each checkpoint captures the full context needed for accurate re-evaluation:

FieldDescription
step_typellm_call, tool_call, connector_call, human_task
step_nameHuman-readable step name
modelLLM model (if applicable)
providerLLM provider (if applicable)
tool_contextTool name, type, and input (if applicable)
user_idActor who triggered the original gate
client_idClient identity
step_inputFull step input for policy evaluation
policies_evaluatedAll policies checked at checkpoint time
policies_matchedPolicies that contributed to the decision

This full context ensures that resume produces accurate policy decisions. If the checkpoint only stored the decision without context, policies that depend on model, provider, or tool type would produce different results on resume.