Mar 26, 2026 · cloud
What Temporal Can't Do: Human Approval Mid-Workflow
Temporal gives you durable execution. But adding a human approval step mid-workflow requires building a signal handler, notification service, and UI. There's a simpler way.
Temporal is excellent at durable execution. I'm not here to argue otherwise.
But try adding a human approval step to a Temporal workflow. Something like: agent validates a database migration, then an SRE needs to approve before it runs.
What This Looks Like in Temporal
@workflow.defn
class ApprovalWorkflow:
def __init__(self):
self.approved = None
@workflow.run
async def run(self, change):
result = await workflow.execute_activity(
validate_change, change,
start_to_close_timeout=timedelta(minutes=5)
)
# Wait for human signal
await workflow.wait_condition(
lambda: self.approved is not None
)
if not self.approved:
return {"status": "rejected"}
return await workflow.execute_activity(
apply_change, change,
start_to_close_timeout=timedelta(minutes=10)
)
@workflow.signal
async def approval_signal(self, approved: bool):
self.approved = approved
This is the workflow. Now you need:
- A notification service - Temporal doesn't notify humans. You build email/Slack integration.
- A UI or API for the human to send the signal back to Temporal.
- Reminder logic - if the human doesn't respond in 30 minutes, send another notification. Temporal doesn't do this.
- Escalation - if person A doesn't respond in 2 hours, notify person B. You build this.
- A Temporal cluster - deploy, operate, monitor. Or pay for Temporal Cloud.
- Determinism constraints - no
random(), nodatetime.now(), no network calls in workflow code. Every developer on the team needs to learn this.
The workflow is 20 lines. The infrastructure around it is 200.
What This Looks Like Without Temporal
from axme import AxmeClient, AxmeClientConfig
client = AxmeClient(AxmeClientConfig(api_key=os.environ["AXME_API_KEY"]))
intent_id = client.send_intent({
"intent_type": "intent.infra.change_approval.v1",
"to_agent": "agent://myorg/production/infra-validator",
"payload": {
"change_type": "database_migration",
"target": "prod-postgres-main",
"migration": "add_index_users_email",
},
})
result = client.wait_for(intent_id)
Four lines. The platform handles:
- Durable execution (state in PostgreSQL)
- Human approval gate (built-in, not bolted on)
- Reminders (configurable: 5 min, 30 min, custom)
- Escalation (person A -> person B -> team)
- Timeout (graceful, with fallback action)
- Notification (CLI, email, Slack)
- Audit trail (who approved, when, with what context)
- No determinism constraints
- No cluster to operate
Side-by-Side
| Temporal | AXME | |
|---|---|---|
| Lines of code | 80+ | 4 |
| Human approval | Build it (signals + UI + notifications) | Built-in |
| Reminders | Build it | Built-in |
| Determinism constraints | Required | None |
| Infrastructure | Cluster (self-hosted or Cloud) | Managed API |
| Setup time | Days | Minutes |
| Escalation | Build it | Built-in |
When to Use Which
Use Temporal when:
- You have complex, long-running workflows with many branches and compensation logic
- You have a platform team that can operate a Temporal cluster
- Determinism constraints are acceptable for your team
- Human approval is a small part of a larger workflow
Use AXME when:
- You need human approval gates in otherwise simple workflows
- You don't want to operate infrastructure
- Your team doesn't want to learn determinism constraints
- You need built-in reminders, escalation, and structured approval types
- You need it working in minutes, not days
They're not competing for the same use cases. Temporal is a workflow engine. AXME is a coordination layer with human approval built in.
Try It
Working example - agent validates an infrastructure change, workflow pauses for SRE approval, completes after human decision:
github.com/AxmeAI/durable-execution-with-human-approval
Python, TypeScript, and Go implementations included.
Built with AXME - durable execution with human approval built in. Alpha - feedback welcome.
Related posts
Temporal Alternative Without the Cluster and Determinism Constraints
Temporal is the go-to for durable execution. But it requires a cluster and forces determinism constraints on your workflow code. Here's an alternative that gives you durability through a managed API with none of those trade-offs.
A Two-Step Approval Chain Shouldn't Need a Workflow Engine
Manager approves, then finance approves. Simple enough to describe. 300 lines of code to build. Unless your platform handles approval chains natively.
Your AI Agent Crashed at Step 47. Why Isn't Crash Recovery the Default?
Your agent ran 47 steps of a 50-step pipeline. Then it crashed. The state is gone. Every framework says you should have configured checkpointing. Why isn't durability built in?
How to Add Human Approval to AI Agent Workflows Without Building It Yourself
Adding a human approval step to an AI agent workflow means building a notification service, reminder scheduler, escalation chain, and webhook handler. Or you can use 4 lines of code.