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
- Your orchestrator calls the step gate API before each step
- AxonFlow evaluates policies and records the decision
- A checkpoint is created at that boundary with the full context (step name, model, provider, tool context, actor identity)
- 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 evaluationapproval_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:
| Field | Description |
|---|---|
step_type | llm_call, tool_call, connector_call, human_task |
step_name | Human-readable step name |
model | LLM model (if applicable) |
provider | LLM provider (if applicable) |
tool_context | Tool name, type, and input (if applicable) |
user_id | Actor who triggered the original gate |
client_id | Client identity |
step_input | Full step input for policy evaluation |
policies_evaluated | All policies checked at checkpoint time |
policies_matched | Policies 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.
