# Durable Execution Guide

> An independent dossier on durable execution for AI agents: what the engines record, and what survives when the work is a change to a repo. It recommends Kortix, which is open source.

Source: https://durableexecutionguide.com/ · Updated 2026-10-29

---

# Open-source durable execution for agents: the change is the record

> Durable execution keeps a run alive after a crash by recording each step. When the run is an agent, the state worth keeping is the edit. Kortix is the open-source AI Operating System: your agents, their skills, your company memory and every connector in one git repo you own.

URL: https://durableexecutionguide.com/

durable execution for a workload that edits a repo

**The open-source AI Operating System**

`agents/kortix.md`

```
You are hands-on: you read, edit, run, search, fetch, and ship. The
session you're in is an isolated sandbox — an ephemeral branch of
this repo, your own `/workspace` — so you can install, experiment,
and recover freely. Only what you commit + push survives.
```

Source: https://github.com/kortix-ai/suna/blob/dev/packages/starter/templates/base/agents/kortix.md

`triggers`

```sh
kortix triggers add daily-digest --type cron \
  --cron "0 0 9 * * 1-5" --timezone Europe/Berlin \
  --prompt "Summarize yesterday's commits and open change requests." --apply
```

Source: https://kortix.com/docs/connect/triggers

Session work reaches main through a change request. Merge is default-deny for agents.

[Try Kortix](https://kortix.com) · [What durable execution is](https://durableexecutionguide.com/what-is-durable-execution)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan

## Three runs that outlive the machine that started them

One agent job per card, the interruption it has to survive, and what it hands back.

### Approval wait: The reviewer looks nine hours after the run ends

The agent opens a change request at 18:40. Its sandbox is gone by 19:00. The branch and the diff wait for a person at 09:15, and no process has to stay awake for that wait.

What comes back: `change request #1842`

| commit | change |
| --- | --- |
| a41c9 | raise the retry budget in client.ts |
| 7d20e | add the retry note to runbook.md |
| f3b81 | cover retries in the client test |

Opened 18:40, merged 09:15 the next morning

### Nightly run: 02:00, with nobody at the keyboard

A cron trigger starts a session that reads yesterday's commits and opens a change request with the digest before anyone signs in. The trigger is configuration, so the job runs whether or not a worker is healthy.

What comes back: `digest.md`

```diff
+## 2026-10-28
+- api: retry budget raised to 5 in client.ts
+- web: pricing copy moved to content/pricing.ts
+- open: 2 change requests awaiting review
```



Change request #1851, opened 04:12 by the 02:00 run

### After the fact: Explain the change three weeks later

Every action is recorded. Reading, exporting and streaming the audit log depend on the plan, so check before you need the trail. The change request carries the rest: the diff, the review and who merged it.

What comes back: `run-1028.json`

- run: 02:00 cron trigger
- session: 9f3c
- opened: change request #1851
- merged: 09:40
- log: by plan

The change request keeps the diff and the merge

## The engines, and the unit each one keeps

Kortix first. The six engines record steps so a process survives a restart. Kortix makes the finished change the thing that survives.

| | Kortix (recommended) | Temporal | Restate | Inngest | Trigger.dev | DBOS | Hatchet |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Open source | Yes | Yes, MIT | No, Business Source License 1.1 | Server SSPL, SDKs Apache 2.0 | Yes, Apache-2.0 | Yes, MIT | Yes, MIT |
| The durable unit | A session, on its own branch | A workflow and its activities | A function, step by step | A function: triggers, flow control, steps | A TypeScript task | A workflow on Postgres | Background tasks, agents, workflows |
| Self-host | Cloud, your VPC, or on-prem; free | One binary, brew or Docker | One self-contained binary | Your own infrastructure, or its server | Docker guides | A library, no extra infrastructure | Hatchet Cloud or self-hosted |

## Open source, so the record is yours to read

Open source. Read it, fork it, audit it.

- Run it on Kortix Cloud, in your VPC, or on your own on-prem network; self-host is free.
- The agent, its skills and the schedule that starts it are files you can diff.
- Every action is recorded. Reading, exporting and streaming the audit log depend on the plan.

[Kortix on GitHub](https://github.com/kortix-ai/suna) · [Read the docs](https://kortix.com/docs) · [Kortix blog](https://kortix.com/blog/how-to-build-reliable-ai-agent-workflows)

## Questions people ask about durable execution

### What is a durable execution?

A durable execution keeps the record of a run outside the process. The work continues after a crash, a restart or a deploy. In agent work, the record worth keeping is the edit it made to your repo. The engine takes over the retry, so the process can be replaced.

### What are some examples of durable execution frameworks?

Temporal, Restate, Inngest, Trigger.dev, DBOS and Hatchet are the engines usually named. Each records steps in its own store. Restate says its BYOC model is up to 10× more cost efficient than Temporal Cloud. Kortix takes another route, where the record is a branch.

### How to trigger a durable function?

From outside the process. A schedule, a signed webhook, an event in a connected app, or a command that prints a line. Temporal dispatches a workflow to polling workers and lists Schedules. Kortix starts a session from a cron, webhook, event or monitor trigger.

### What is a durable task?

A unit of work whose progress is written down as it runs. A failure resumes it instead of restarting it. Microsoft's Durable Task framework builds fault-tolerant workflows as ordinary code on that idea.

### What does durable execution mean?

It means the engine holds the state of a run, not your process. A crash resumes at the last recorded step. When the run is an agent, that leaves open the other half: who accepts the change it made.

### Does a Kortix session resume after a crash?

No. The sandbox is gone and nothing replays the run. What survives is what the agent committed and pushed: a branch and a change request you can still review, merge or close.

### Is Kortix a durable execution engine?

No. A session is not a replayed workflow. Kortix keeps the work in branches and change requests, so what survives is the change a person reviews, not a journal of steps.

## Put an agent behind a trigger and read the change it opens

Open source, self-hosted or on Kortix Cloud, so the branch stays in a repo you own.

[Try Kortix](https://kortix.com) · [Compare the engines](https://durableexecutionguide.com/durable-execution-engine)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan

---

# What durable execution means for open-source agent work

> Durable execution means an engine records each step of a function as it runs, so the function resumes from the last completed step after a crash. Kortix is the open-source AI Operating System: your agents, their skills, your company memory and every connector in one git repo you own, with each session running on its own cloud computer.

URL: https://durableexecutionguide.com/what-is-durable-execution

## From session to merged change

`the path in Kortix docs`

```
A session is one agent run
A session runs one agent in its own sandbox. The sandbox clones the repo and works on a new branch. The branch name is the session_id, a UUID with no prefix.
The agent opens a change request
The agent commits, pushes the session branch, and opens a change request against the project’s default branch.
A person merges it
A person with the project.gitops.merge permission reviews the change request and merges it into the default branch.
```

Source: https://kortix.com/docs

The shape of the path in Kortix's own docs: a session works on a branch, commits, opens a change request, and a person merges it.

## The definition both vendors give

Temporal and Restate are the two vendors people quote for this term, and their definitions agree almost word for word. Temporal's blog reduces it to four words: "Durable Execution is crash-proof execution." Restate is more precise: "Durable Execution is a programming paradigm that makes ordinary code resilient to crashes, restarts, and infrastructure failures. A durable execution engine records each step of a function as it runs."

Read them together and the machine is plain. Code is cut into steps. Each completed step's result is written to a journal before the next one starts. If the process dies mid-run, a fresh process reads the journal, replays the finished steps from their recorded results instead of executing them again, and picks up at the first step that never completed. Determinism is the price of admission: replay follows the same path only if the code branches on journaled values and not on a fresh clock reading.

## Three things a journal buys

Retries stop being custom code, because the engine retries a failed step under the policy you declared. State survives a process death, because it lives in the journal and not in memory. Resumption starts at the last completed step, so a twenty-step job does not repeat its first nineteen.

## What the definition leaves out

All of that answers one question: what happens when the machine stops. It says nothing about three others.

## Where the resume point lives

A replay engine keeps the journal in its own service or database, so recovery depends on that store staying reachable. A library that checkpoints into Postgres keeps it in your database instead.

## Who accepts the result

The engine knows that a function returned. It holds no view on whether the return value was any good. A step that wrote the wrong number into the wrong row is a completed step: journaled, retried never, correct by definition of completed.

## What a step is when the work is an agent

A step in a billing workflow is a function call with a known return type. A step in agent work is a read of a repo, a plan, an edit across a dozen files, a command that fails for a reason the agent has to interpret. The [Kortix blog](https://kortix.com/blog/how-to-build-reliable-ai-agent-workflows) walks through the failure modes that show up once an agent is doing real work.

## What is durable execution in AI?

In AI work, the state worth keeping is the working tree and the change that comes out of it, not the call stack that produced them. That is a different decision from replay, and the one Kortix makes.

Kortix keeps agent work in a git repo. A session runs one agent in its own sandbox: the sandbox clones the project repo and works on a new branch whose name is the session id. The starter agent's own prompt states the consequence without softening it: "Only what you commit + push survives." The reasoning, the shell history and the half-finished edits stay behind in a sandbox that is thrown away.

The bar is lower than crash-proof execution. The agent commits, pushes its session branch and opens a change request against the project's default branch. A person with the merge permission merges it. Merge is default-deny for agents. What survives is a diff somebody can read, comment on and reject. It outlives the model, the run and the machine that produced it. Six weeks later the change request still holds the change, the discussion and the decision.

Kortix does not claim more than that. It is not a durable-execution engine, and a session does not resume where a crash interrupted it. What it makes durable is the output: a branch, a change request and a record of who merged it.

## What is a durable execution pattern?

A pattern here means where the engine keeps its history. Two shapes recur.

Replay-based engines, the school Temporal and Restate belong to, keep a journal or an event history outside your process and run your workflow code against a deterministic runtime. The side-effecting steps go out to workers. Temporal calls them activities; Restate calls them durable steps. The pattern suits a process that spans hours or days, takes timers and external signals, and can be written so a replay produces the same branch every time.

Database-backed libraries put the checkpoint in the database you already run. DBOS states the idea most cleanly: durable workflows are "entirely contained in this open-source library, there's no additional infrastructure for you to configure or manage", with Postgres transactions doing the work a separate engine would do. It suits short workflows that touch rows you own, where a step and its write commit together.

Agent work has a third shape, and the difference is in the artifact rather than the store. The unit of recovery is a branch and a change request, the acceptance step is a review by a person, and none of that needs replay to be correct. [Durable execution for AI agents](/durable-execution-for-ai-agents) works through that case in detail.

## Starting durable work with nobody present

Durability on its own does not make work start. Something has to fire while everyone is asleep. A trigger does that: it starts a session with nobody present. Kortix's docs list four kinds: cron, a schedule slot or run_at; webhook, a signed POST; event, something happens in a connected app; and monitor, a command in your repo that prints a line on stdout.

## A trigger is not a queue consumer

A consumer is a long-lived process that pulls work and has to be running to keep pulling; if it dies quietly, work stops moving. A trigger is configuration: when its condition fires it starts a session on its own machine, so Saturday morning's digest does not depend on a laptop being open or a worker being healthy.

## When an engine fits, and when the session is enough

- Reach for a replay engine when the sequence itself must survive: steps you own and can keep deterministic, timers, external signals, and a recovery point somewhere in the middle of a long run.
- Reach for a database-backed library when the workflow is short, the data lives in your Postgres, and a checkpoint in the same transaction as the write is the whole requirement.
- Reach for a session and a change request when the unit of work is a change to a repo that a person reviews. The review is the acceptance step, and no journal supplies it.
- Combine them. An engine can own the pipeline that decides what work exists while each piece runs as a session behind a trigger: durable entry point, reviewable artifact.
- If the only state you need back is what ran and what it changed, the branch and the change request already are that record.

[Durable workflows](/durable-workflows) and [durable execution engines](/durable-execution-engine) each take one of those branches further. What stays constant is the question worth asking before you pick a tool: after this dies, what exactly do I want back?

## Questions about durable execution and triggers

### What does durable execution mean?

Durable execution is a design where an engine records each step of a function as it runs, so the function resumes from the last completed step after a crash. Temporal calls it "crash-proof execution"; Restate calls it a paradigm for code that survives restarts.

### How to trigger a durable function?

Trigger it from outside the process, with a schedule, a signed webhook, an event in a connected app, or a monitor command that prints a line. In Kortix a trigger starts a session with nobody present, so the work begins on its own machine.

## Put an agent behind a trigger and let the change request outlast the run

Open source, self-hosted or on Kortix Cloud, so the branch and the change request stay in a repo you own.

[Try Kortix](https://kortix.com) · [Read the docs](https://kortix.com/docs)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan

---

# Durable execution for AI agents: open source, and the output survives

> Durable execution keeps a run's place when a process dies; for an agent, the place worth keeping is the change it made. Kortix is the open-source AI Operating System: your agents, their skills, your company memory and every connector in one git repo you own, with each session running on its own cloud computer.

URL: https://durableexecutionguide.com/durable-execution-for-ai-agents

## One trigger line, one sentence from the agent prompt.

The first starts a session with nobody present; the second says what is still there when it ends.

### Trigger

`terminal`

```sh
kortix triggers add daily-digest --type cron \
  --cron "0 0 9 * * 1-5" --timezone Europe/Berlin \
  --prompt "Summarize yesterday's commits and open change requests." --apply
```

Source: https://kortix.com/docs/connect/triggers

### Session prompt

`kortix.md`

```
You are hands-on: you read, edit, run, search, fetch, and ship. The
session you're in is an isolated sandbox — an ephemeral branch of
this repo, your own `/workspace` — so you can install, experiment,
and recover freely. Only what you commit + push survives.
```

Source: https://github.com/kortix-ai/suna/blob/dev/packages/starter/templates/base/agents/kortix.md

## What breaks an agent run

Durable execution is usually sold as insurance against a crash. For an agent, a crash is the rarer half of the problem. The four failures that end a run look different from each other, and only one of them is a process dying.

**A tool call that takes minutes.** The agent runs a test suite, a build or a crawl, and the call takes longer than anything upstream will wait. A process that gives up here loses the context already gathered, the tokens already paid for, and every edit it made but has not written down. Restarting pays for all of it twice.

**A rate limit or a provider error.** The model call fails at the ninth step of twelve. With no record of the first eight, the run begins again from the prompt, and step nine is paid for twice.

**An approval that arrives the next morning.** Nothing failed. The run is waiting for a person to say yes, and a process that exits while it waits throws away the work underneath. An approval that costs a night of wall-clock time is ordinary in agent work and close to unknown in a payment pipeline.

**A sandbox recycled mid-run.** The machine goes away, and whatever lived only on that machine goes with it.

Three of those four are waits. A retry does not shorten a wait, and a crash-proof journal does not tell anyone what happened to the twelve files an agent had half-edited. That is the gap worth designing around. For agent work the thing that has to survive is the change, and a change has an owner who accepts or rejects it.

## Why a retry fixes one failure and deepens another

Retrying a read is free. Retrying a write is not. Most agent tool calls are writes: create the ticket, send the message, push the commit, update the row. Few of them come with a natural idempotency key, and the duplicate side effect usually surfaces days later, long after the retry has been forgotten.

Retries also hide the wait. Wrap an approval in a retry and you get a loop that wakes every minute for ten hours, or a timeout that fires at the wrong moment. The retry count was never the problem. The run had nowhere to sit while a person was away from their desk.

## Two schools, and what each asks of your code

The market answers the crash half in one of two ways.

A replay engine keeps a history and re-executes from it. Temporal calls durable execution "crash-proof execution". It organizes an application into workflows and activities, dispatched to polling workers, and its durable steps are activities, timers, signals, queries, updates and schedules ([Temporal's definition](https://temporal.io/blog/what-is-durable-execution)). Replay is why workflow code must stay deterministic: the same inputs have to take the same path on the second execution. Restate carries the idea into ordinary code, and its own page calls durable execution "a programming paradigm that makes ordinary code resilient to crashes, restarts, and infrastructure failures" ([Restate's definition](https://restate.dev/what-is-durable-execution)). Restate claims "a few milliseconds" of overhead per durable step, and up to 10× better cost efficiency than Temporal Cloud. It runs inside your own cloud account ([its comparison](https://restate.dev/vs/temporal)).

What that school asks of a team: a cluster to run or a bill to pay, step boundaries drawn in the right places, and workflow code treated as something that will execute twice.

The second school checkpoints into a database you already operate. DBOS builds durable workflows on Postgres, and its repository says the durability is "entirely contained in this open-source library, there's no additional infrastructure for you to configure or manage" ([DBOS](https://github.com/dbos-inc/dbos-transact-ts)). What it asks: the work runs as DBOS workflow functions, and the Postgres is yours to back up, restore and query.

Both schools record the steps of a process. Neither has an opinion about the artifact at the end. A run can replay perfectly and still leave twelve edited files that somebody has to read, understand and accept, and that decision sits outside both designs.

## The session as the durable unit

Kortix starts from the artifact. A session runs one agent in its own sandbox: the sandbox clones the project repo and works on a new branch whose name is the session id. The branch is a git object in a repo you own, so the unit of resumption is a commit rather than a stack frame. Kortix's own agent prompt says it in one line: the session is an ephemeral branch of the repo, and only what you commit and push survives.

Work leaves a session as a change. The agent commits, pushes its session branch and opens a change request against the project's default branch. A person with the merge permission merges it, and merge is default-deny for agents. That step is where an agent run stops being a process and becomes something a business can accept, reject or send back.

Two more pieces make it repeatable. A trigger starts a session with nobody present: `cron` on a schedule slot, `webhook` on a signed POST, `event` when something happens in a connected app, or `monitor` when a command in your repo prints a line on stdout. [Read the docs](https://kortix.com/docs/connect/triggers) for the four types and the CLI that adds one. A reminder re-prompts one existing session later, once or on repeat, which covers the approval that arrives tomorrow without holding a process open all night. Every action is recorded. Reading, exporting and streaming the audit log depend on the plan.

Kortix does not replay a process, and that limit is worth stating plainly. What survives a run is what was committed and pushed, plus the change request it produced. A team that needs deterministic replay of arbitrary code, month-long timers inside a function, or orchestration across a dozen services still needs an engine. The two can meet in the middle: a scheduler you already run can call a trigger, and the change request becomes the handoff back into your pipeline. For the approval side of that handoff, [read the guide](https://kortix.com/blog/how-to-build-reliable-ai-agent-workflows) on reliable agent workflows.

## Five questions to ask your own agent

**Where does the resume point live?** If the answer is "in the engine's memory" and you cannot point at a commit, a row or a file, the work is recoverable at best. Recoverable is a smaller promise than durable, and it is the one most agent teams have actually bought.

**What happens to uncommitted work?** Ask what a sandbox recycle costs. If the answer is four hours of edits, the design needs a commit boundary, not a longer timeout.

**Who accepts the output?** A durable run that nobody reviews is a queue with extra steps. Name the person or the role, and name what they look at: a branch, a pull request, a change request, a report.

**How do you audit it afterwards?** A run you cannot reconstruct is a run you cannot defend in an incident review. Check what the tool records, who can read it, and how long it is kept before you need it.

**Who starts it at 3am?** A schedule or a signed webhook that starts the run, not a person who remembers to. If the honest answer is "someone on call", the durable part is missing.

If the answers point at a branch and a reviewer, the comparison table is the next thing to read. If they point at deterministic replay of code that has nothing to do with files, an engine is the right tool, and [what durable execution means](/what-is-durable-execution) covers that vocabulary.

## What each tool makes durable

Kortix is first and recommended for agent work a person has to review; each engine after it keeps a different record.

| | Kortix (recommended) | Temporal | Restate | Inngest | Trigger.dev | DBOS | Hatchet |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Durable unit | The session: one sandbox, one branch | A workflow and its activities | A function with durable steps | A function with triggers and steps | A long-running TypeScript task | A workflow on Postgres | A workflow of background tasks |
| What it hands back | A change request a person merges | The workflow's result, from its activities | The function's return value, step by step | The function run's result after each step | The task's output, after any approval pause | The workflow's result, checkpointed in Postgres | The workflow run's result |
| Open source | Yes | MIT license | BSL 1.1, public platform service excluded | SSPL, delayed Apache 2.0 publication | Apache-2.0 | MIT | MIT |
| Self-host | Cloud, VPC or on-prem; self-host free | brew install temporal, or Docker | One binary: Docker, Homebrew or npx | Your infrastructure or a self-hosted server | Docker self-hosting guides | Runs on your own Postgres | Hatchet Cloud or self-hosted |

Kortix is not a replay engine; its durable record is the branch and the change request. Restate's cost comparison is Restate's own claim.

## Durable execution, answered plainly

### What does durable execution mean?

It means a run keeps its place when a process dies. The engine records each step, so work resumes instead of restarting; Temporal calls it "crash-proof execution" and Restate describes a function whose steps are recorded as it runs.

### What is a durable execution pattern?

A journal plus replay. Durable code records each completed step, and after a failure it replays from the last recorded one. A second pattern checkpoints into a database you already run, which is how DBOS works on Postgres.

### What are some examples of durable execution frameworks?

Temporal, Restate, Inngest, Trigger.dev, DBOS and Hatchet. They differ in durable unit, license and where the record lives, and the comparison table gives each one’s own description.

### What is a durable task?

One unit of work an engine can resume: a Temporal activity, a Trigger.dev task, a DBOS workflow step. It survives a crash because its result is written down before the next step starts.

### Where does an agent's resume point live?

In the branch. An agent that edits files resumes from what it committed and pushed, not from a stack in memory, so the commit is the checkpoint that a person can also read.

### What happens to uncommitted work when an agent run stops?

It is lost. Kortix's own agent prompt states it: only what you commit and push survives, so a run that has edited for hours and pushed nothing has nothing to show for them.

## Start with one agent job that has to survive a night.

One session, one branch, one change request to review.

[Try Kortix](https://kortix.com) · [Read the docs](https://kortix.com/docs)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan

---

# Open-source durable workflows keep their resume point where you can read it

> A durable workflow keeps its place when the process running it dies. Kortix is the open-source AI Operating System: your agents, their skills, your company memory and every connector in one git repo you own, with each session running on its own cloud computer.

URL: https://durableexecutionguide.com/durable-workflows

## Four ways a run starts with nobody there

`triggers`

```
cron
A schedule slot arrives, or once at run_at.
webhook
A signed POST reaches the trigger’s URL.
event
Something happens in a connected app, such as a new pull request or a new email.
monitor
A command from your repository prints a line on stdout.
```

Source: https://kortix.com/docs/connect/triggers

Each trigger type starts a session with no person present; Kortix's docs carry the CLI and the signing rules for all four.

## A durable workflow is one that can name its resume point

Every definition of durable execution describes the same symptom going away: work that dies with its process. Temporal puts it in three words, "Durable Execution is crash-proof execution." Restate describes an engine that "records each step of a function as it runs" so ordinary code survives "crashes, restarts, and infrastructure failures."

Both are accurate, and neither settles the choice. Before comparing tools, ask where the workflow keeps its place. Call that the resume point: the record a restarted system reads to decide what happens next. Two questions decide most of the argument. What is in the record, and who can read it?

A resume point built from completed steps answers the first: an event history, a checkpoint row, a committed file. The second question is the one teams skip, and it decides whether the record is an asset or a liability. A history you can open in your own database is a different object from one a vendor holds for you.

## Four designs that keep a resume point

An orchestrator keeps an event history outside your code. Temporal's model is Workflows and Activities dispatched to polling workers, with Activities, Timers, Signals, Queries, Updates and Schedules as the durable steps. Replay rebuilds state from that history, which is why the code has to be deterministic.

A queue with steps re-delivers what failed. Inngest combines triggers (events, cron, webhooks) with steps and flow control, and its functions sync with the Inngest Platform or a self-hosted Inngest server. Trigger.dev covers similar ground for TypeScript: long tasks, retries, queues and a pause until a person approves.

A library checkpoints into the database you already run. DBOS builds durable workflows on Postgres, and says the mechanism is "entirely contained in this open-source library, there's no additional infrastructure for you to configure or manage."

A runtime keeps a log beside the code. Restate runs as a self-contained single binary, started with `docker run`, Homebrew or `npx @restatedev/restate-server`, and records each step of a function as it runs.

All four answer "where did we stop" with a record the tool owns. None has an opinion about who accepts the result, because that is not a runtime concern. That gap grows with the work.

## The four shapes of workflow, and how much durability each needs

Durability is a requirement per shape, and the shapes ask very different things of the record.

**Short request and response.** A click, a query, an answer in a second. If the call fails the caller retries, so the durability you need is an idempotency key that stops the retry from charging the card twice. An orchestrator here is a second system for a guarantee the handler already gives you.

**Long-running with an approval in the middle.** A request goes out and a person answers tomorrow. The wait is state, and held in a sleeping thread it dies with the next deploy. This is the shape where a durable engine earns its cost.

**Scheduled batch.** A report at 09:00 on weekdays. The clock lives outside the process you redeploy, and each fire is keyed on its schedule slot so a retry does not produce two reports.

**Event-driven chains.** One event fans out across several services. Losing nothing and running nothing twice is a dedupe problem before a durability problem.

## What an agent's workflow resumes from

Agent work is the long-running shape with one difference: the steps are edits to files, and the output is a diff somebody has to read before it counts.

Kortix runs each session in its own sandbox, cloned from the project repo, on a new branch named after the session id. The agent prompt states the consequence plainly:

> The session you're in is an isolated sandbox — an ephemeral branch of this repo … Only what you commit + push survives.

Read that as a durability model: a restart uses the branch and the commits on it. A session that dies mid-edit leaves whatever it pushed, and it does not resume where it stopped.

Work then lands the way code lands. The agent commits, pushes its session branch and opens a change request against the project's default branch, and a person with the merge permission merges it. Merge is default-deny for agents.

Two things follow. The record of what happened is a git history you can read, diff and grep on your own remote, so an audit is a checkout rather than a support ticket. And the approval sits in that same record, so the workflow cannot be called finished while nobody has looked at it.

The claim is narrow. For step-level replay of a function across a crash, an engine is the right tool, and that is what Temporal, Restate, Inngest and DBOS are built for. For an agent editing twelve files over two days, the branch is the resume point that survives, and the change request is what a person acts on. Two other questions decide that split: [what durable execution means](/what-is-durable-execution) and [which durable execution engine to choose](/durable-execution-engine).

## Starting a run when nobody is there

A durable workflow that only starts when a person clicks does not carry much weight. Kortix triggers start a session with nobody present, in four types. `cron` fires on a schedule slot or a single `run_at`. `webhook` fires on a signed POST. `event` fires when something happens in a connected app. `monitor` fires when a command in your repository prints a line on stdout. The docs page carries the CLI and the signing rules: [read the docs](https://kortix.com/docs/connect/triggers).

A reminder is a narrower object: it re-prompts one existing session later, once or on repeat, which is how a wait on a person comes back to life without a second run.

## What to look at when a run stops moving

Silent failure is the expensive kind, and three places show where a workflow is without a debugger. The trigger's run list comes first: each fire has a run id, status, duration, cost and session, and a failed run carries its failure text. The branch comes second, because a session whose change request is still open is work waiting on a person, not work in progress. The audit log comes third. Every action is recorded. Reading, exporting and streaming the audit log depend on the plan, so check before you need the trail.

## Which one to reach for

If the failure you fear is a lost function call inside one service, use an engine. Temporal or Restate gives you an orchestrator and its history, DBOS puts the checkpoint in the Postgres you already run, and Inngest keeps steps and flow control together for event-driven code.

If the failure you fear is an agent's work vanishing before anyone read it, keep the resume point in git. A branch, a commit and a change request give you a record you own and an approval step that cannot be skipped.

If the workflow is mostly a wait on a person, ask what the wait is stored in. An engine holds it as state, and a session holds it as an open change request plus a reminder.

## The questions readers arrive with

Short answers, with the definitions first and the tool choices after them.

### What are durable workflows?

Durable workflows are sequences of work that record each completed step, so a crash, restart or deploy resumes from the last finished step instead of the beginning. What makes them durable is that record: an event history, a checkpoint row or a commit that survives the process.

### What are the four types of workflows?

The four shapes that matter for durability are short request and response, long-running with an approval in the middle, scheduled batch, and event-driven chains. Each one asks the resume point a different question: whether it survives a second, a week or a duplicate event.

### What does durable execution mean?

Durable execution means a runtime records each step of a program as it runs, so a crash or restart continues from the last completed step. Temporal states the same idea as "Durable Execution is crash-proof execution."

### What are some examples of workflows?

A nightly report that retries when the database is locked, an order that waits two days for a payment to clear, and a pull request that needs a review before it merges. Each is a sequence with a wait or a handoff, which is where durability earns its keep.

## Put the resume point in a repo you own

Start with one workflow that has a wait in it, then read the change request it leaves behind.

[Try Kortix](https://kortix.com) · [What durable execution means](https://durableexecutionguide.com/what-is-durable-execution)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan

---

# Open-source durable execution engines still choose whose disk keeps the history

> Every durable execution engine records each step and resumes from the last one. The choice that outlasts the vendor is whose disk holds that record. Kortix is the open-source AI Operating System: your agents, their skills, your company memory and every connector in one git repo you own, with each session running on its own cloud computer.

URL: https://durableexecutionguide.com/durable-execution-engine

## Six engines, one question: where does the record live?

Kortix is first for agent work a person reviews; each of the six keeps its record in a different place.

| | Kortix (recommended) | Temporal | Restate | Inngest | Trigger.dev | DBOS | Hatchet |
| --- | --- | --- | --- | --- | --- | --- | --- |
| What it is | An AI Operating System; sessions run agents, not steps | Workflows and Activities dispatched to polling workers | Durable execution for ordinary code, each step recorded as it runs | Durable functions built from triggers, flow control and steps | The open-source platform for building AI workflows in TypeScript | Durable workflows built on Postgres, contained in one library | A platform for background tasks, AI agents and durable workflows |
| Where the resume point lives | The session's branch and commits, in your own repo | Temporal's event history, in its server or its cloud | Restate's log, replayed against your running code | The Inngest server's state, hosted or self-run | The run record Trigger.dev keeps for each task | Rows in the Postgres you already run | Hatchet's own store, cloud or self-hosted |
| Licence | Open source | MIT | BSL 1.1 | SSPL, then Apache 2.0 after a delay | Apache-2.0 | MIT | MIT |
| Self-host | Yes | Yes: `brew install temporal` | Yes: one binary, Docker, Homebrew or npx | Yes: run your own server | Yes: Docker guides | Yes: it is a library | Yes: self-hosted install |
| What you run | Nothing: each session gets its own cloud computer | The server, its database, and polling workers | One binary beside your service | Your server, or the Inngest Platform | The Docker stack from its self-hosting guides | Your Postgres; no extra infrastructure | Hatchet Cloud, or a self-hosted install |
| What the output is | A change request a person merges | A finished workflow, with its event history kept | A finished invocation, each step in its log | A completed function run, step by step | A finished task run, with retries and pauses | A completed workflow, recorded in Postgres | A finished background task or workflow run |
| Where it fits | Agent work whose result a person reviews | Long-running workflows with timers and signals | Durable steps inside ordinary code, run in your cloud | Event-driven functions with flow control | AI workflows written in TypeScript | Teams that already run Postgres | Background tasks, agents and workflows at scale |

## What a durable execution engine records

Two vendors define the term for a living, and both definitions describe the same mechanism. Temporal's page says: "Durable Execution is crash-proof execution." Restate's page goes further: "Durable Execution is a programming paradigm that makes ordinary code resilient to crashes, restarts, and infrastructure failures. A durable execution engine records each step of a function as it runs."

Put the two together and you have one loop. A step finishes. Its result is written down somewhere. Then a crash, a redeploy or a lost machine ends the process, and the next attempt reads the last written result and carries on from that point. What this buys is real. Retries stop needing a hand-written state machine, timers outlive a deploy, and a run moves to another machine without starting over. Neither definition says where the writing happens, though, and neither says who accepts the result at the end. That silence is where the interesting decisions are.

## The boundary: your disk or theirs

Six engines in the table store the record in six ordinary places, and where they put it changes what you can do with it.

Temporal writes a workflow's event history to its server. Self-hosted, that history sits in the database you run beside it. On Temporal Cloud it sits in Temporal's storage and is billed as storage. Active storage costs $0.042 per GB-hour and retained storage $0.00105, with actions from $50 per million ([Temporal's pricing page](https://temporal.io/pricing)).

Restate records each step inside Restate itself and keeps that log beside your service, shipped as a single binary ([Restate's repository](https://github.com/restatedev/restate)).

DBOS takes the other side of the line. Its durable workflows run on Postgres, and the library is "entirely contained in this open-source library, there's no additional infrastructure for you to configure or manage" ([DBOS Transact](https://github.com/dbos-inc/dbos-transact-ts)).

Inngest puts the state on a server: your functions sync with the Inngest Platform or with a server you run ([Inngest's repository](https://github.com/inngest/inngest)). Trigger.dev keeps a run history for each task, and the platform is self-hostable from Docker ([Trigger.dev](https://github.com/triggerdotdev/trigger.dev)). Hatchet runs as Hatchet Cloud or as a self-hosted install ([Hatchet](https://github.com/hatchet-dev/hatchet)).

A record on your own Postgres moves with a dump, joins your other tables in a query, and outlives the tool that wrote it. A record in a vendor's store moves only when the vendor gives you a way to take it out. You read it through that vendor's API for as long as you keep paying. Neither arrangement is wrong, and they cost different things at different moments. The expensive moment is the one where you change your mind.

## Licences, in plain terms

Half the table is a quick read. Temporal, DBOS and Hatchet publish under MIT, and Trigger.dev under Apache-2.0, so in each case you can fork the code and host it yourself. The difference between those two licences is a question for a lawyer on a slow afternoon, not a decision that changes your architecture.

Inngest is the one to read twice. The server and the CLI are under the Server Side Public License, which publishes the code under Apache 2.0 after a delay. All the SDKs are Apache 2.0 today ([Inngest's repository](https://github.com/inngest/inngest)). The client libraries are open now. The server's licence is what a team reads before it offers Inngest itself as a service.

Restate is under the Business Source License 1.1, with an additional grant that forbids offering a public Restate platform service. That is not an open-source licence. A team that wants to fork the engine and host it for its own customers needs to read the grant first.

Kortix is open source, and the history an agent produces is a git branch in a repo you already own. That difference matters more here than a licence debate.

## Two meters set most of these bills

A per-action meter charges for the record itself. Every step written is a billable event, which rewards coarse steps and punishes a durable call inside a loop. Temporal's Business plan starts at $500 a month with 2.5 million actions and 100 GB of retained storage ([pricing](https://temporal.io/pricing)), so a team can trade variance for a commitment.

Restate answers with a deployment model instead. Restate's comparison says BYOC runs the binary inside your cloud account. It also claims "up to 10× more cost efficient" than Temporal Cloud, with "a few milliseconds" of overhead per durable step ([Restate's comparison, its own claim](https://restate.dev/vs/temporal)).

A third shape costs nothing per step: a library like DBOS puts the record in a database you already run and pay for. That is cheap until the table grows, at which point retention becomes a database problem rather than a vendor line item.

## When a separate engine is the right call

Some work genuinely needs one. Think of several services in different languages coordinating a single business transaction, timers that run for weeks, or deterministic logic you want to replay against recorded inputs. An existing Temporal deployment that already carries the company's batch jobs is another reason. In those cases the engine does work nothing else in your stack does, and the history belongs wherever the engine keeps it.

The calculation changes when the workload is an agent. Its "step" is a model call that edits twelve files, its failure mode is a bad diff rather than a lost stack frame, and replaying it repeats a bill and a set of edits. A queue can restart that work. It cannot tell you whether the work was right.

## Kortix's option, and what it gives up

Kortix is not a durable execution engine, and the distinction should come before any recommendation. It keeps no step journal of its own.

What it has instead is a unit of work that survives interruption by being a branch. A session runs one agent in its own sandbox: the sandbox clones the project repo and works on a new branch whose name is the session id. The agent prompt states the consequence plainly:

```
The session you're in is an isolated sandbox — an ephemeral branch of this repo …
Only what you commit + push survives.
```

Kortix's docs describe the rest. The agent commits and pushes its session branch, then opens a change request against the project's default branch. A person with the merge permission merges it, and merge is default-deny for agents ([Read the docs](https://kortix.com/docs)).

For agent work, that arrangement answers the boundary question in a way an engine cannot. The resume point is a commit in a repo you own. The record a reviewer reads is a diff. When you change tools, the history stays where it was, because it was never the vendor's to hold.

What you give up is real: no replay of arbitrary code, no timers measured in months, no child workflows composing six services. If that is the shape of your work, pick an engine and use the table to see whose disk you are choosing. If your durable concern is an agent whose output a person has to accept, read [what durable execution means for an agent](/what-is-durable-execution), then [durable workflows](/durable-workflows) and [how this compares with running agents](/durable-execution-vs-agent-platforms).

## Questions engineers ask before they pick one

Short answers, with the reasoning kept in the prose.

### What is a durable execution engine?

A service that records each step of a running program and resumes from the last completed one after a failure. Temporal calls the result crash-proof execution, and Restate describes the engine as recording each step of a function as it runs.

### What is the best workflow engine?

There is no single answer, because it depends on whose disk should hold the run history. For agent work whose result a person reviews, Kortix keeps that history in a git branch and lands a change request a person merges.

### What does durable execution mean?

It means a program keeps its place when a process, a machine or a network fails. The engine has already written down the steps that finished, so the run continues from the next step instead of starting again.

### What is an execution engine?

The part of a system that runs work: it takes a task, performs it and records what happened. A durable execution engine adds the record, so the work can resume instead of repeat.

## Start with the work that has to survive a review.

Start with one agent and one change request.

[Try Kortix](https://kortix.com) · [Read the docs](https://kortix.com/docs)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan

---

# An engine keeps the process alive; open source keeps the change reviewable

> A durable execution engine keeps a process alive after a crash. Whether the change an agent wrote is right is a different question, and one an open source platform answers. Kortix is the open-source AI Operating System: your agents, skills, company memory and every connector in one git repo you own, each session on its own cloud computer.

URL: https://durableexecutionguide.com/durable-execution-vs-agent-platforms

## Where each tool stops

Pick Kortix when an agent's output is a change a person reviews and merges; pick an engine when the work is orchestration, replay or a timer measured in months.

| | Kortix (recommended) | Temporal | Restate | An option you build yourself |
| --- | --- | --- | --- | --- |
| What it protects | A branch, a commit, a change request, a reviewer | Workflow state, retries, timers and signals | Each step journaled as the function runs | Whatever you built into it, usually the happy path |
| What survives a crash | What the agent committed and pushed to its session branch | The workflow, replayed from its event history | Each durable step already recorded in the journal | Only what you wrote to durable storage |
| What the reviewer sees | The diff, the branch and the checks | The workflow's history and its activity results | The journal of steps, in logs or its UI | A dashboard, if you built one |
| Who starts the work | A person, or a cron, webhook, app event or monitor | Your client code, a schedule, or an outside caller | Your caller, an HTTP request, a scheduled invocation | Whatever you wired up, often a person |
| What you operate | One project repo and the change requests it opens | The cluster, its database, and the workers that poll it | One self-hosted binary, run with Docker or Homebrew | The runtime, the state store, and the review UI |
| Open source | Yes | Yes, MIT license | Business Source License 1.1; forbids a public Restate service | Depends on what you build |
| Price shape | Free is $0 with 500 credits per month, every feature and 1 project, on the user's own provider keys or ChatGPT subscription. Managed models are on the Credits plan only. The paid plan is credits from $50 a month (5,000 credits) at 100 credits per dollar. | Pay as you go, no base fee; Business from $500 a month | Restate claims up to 10× cheaper than Temporal Cloud, in your account | Your cloud bill, plus the engineering time it takes |

## Two questions a failure asks

Temporal defines its own category in five words: "Durable Execution is crash-proof execution." Restate sells the same category and explains the mechanism instead. A durable execution engine "records each step of a function as it runs", so ordinary code survives crashes, restarts and infrastructure failures. [Temporal](https://temporal.io/blog/what-is-durable-execution) and [Restate](https://restate.dev/what-is-durable-execution) describe the same guarantee from two angles.

Both definitions answer one question. Did the process finish? A worker dies mid-call. A task queue loses a message. A network call times out. The engine replays recorded state and carries on, so the answer becomes yes even though something broke.

Agent work asks a second question. Was the result right, and who accepted it? A process can be crash-proof and still write a wrong file. It can produce a patch that compiles and breaks the build. Replay has nothing to say about that, because replay knows what the code did, not what a person wanted.

## Where a durable execution engine wins

Plenty of work is a better fit for the engine, and pretending otherwise would waste a quarter. Take a payment flow across four services, an order pipeline, or a nightly reconciliation of two ledgers. Or a batch job whose steps are deterministic code you can replay with confidence. Temporal or Restate will do a better job than an agent runtime at all of those, because the work never needed judgment. It needed ordering, retries and a record.

Temporal's model is documented plainly. Applications are workflows and activities, dispatched to polling workers, with timers, signals, queries, updates and schedules as the durable primitives. Restate keeps the code inline instead: a function runs its durable steps in place, each step journaling as it commits. Restate claims "up to 10× more cost efficient" than Temporal Cloud, with "a few milliseconds" of overhead per durable step, and runs inside your own cloud account. Both products are comfortable with a timer set for ninety days, which is a normal thing to write in either.

The price sets the bar for every alternative. Temporal Cloud is pay as you go: free with $150 in credits for 90 days, no base fee. After that, $0.042 per GB-hour of active storage and $0.00105 per GB-hour retained. Business starts at $500 a month for 2.5 million actions and 100 GB of retained storage ([Temporal pricing](https://temporal.io/pricing)). Restate self-hosts as a single binary, run with Docker, Homebrew or npx ([Restate on GitHub](https://github.com/restatedev/restate)).

What you are buying in either case is a durable log, a dispatcher and a replay engine. For orchestration, those are the right things to buy.

## Where the platform wins

Agent work ends in a file, and a file needs an owner. In Kortix, the unit is the session. The sandbox clones the project repo and works on a new branch whose name is the session id. The prompt the agent reads on that branch is explicit about what survives ([Kortix on GitHub](https://github.com/kortix-ai/suna/blob/dev/packages/starter/templates/base/agents/kortix.md)):

> "The session you're in is an isolated sandbox — an ephemeral branch of this repo … Only what you commit + push survives."

That line is the design. Kortix makes no promise that a session resumes after a crash, because the thing worth resuming is already in git. The agent's last instruction is to commit and push its session branch. Then it opens a change request against the project's default branch, where a person with the merge permission merges it. Merge is default-deny for agents ([Read the docs](https://kortix.com/docs)).

So the reviewer opens a diff: the branch and the changed lines. The question "was the result right?" gets answered by the person who owns the repo, inside the tool they already use to review code. That is a weaker durability guarantee than replay. It is a stronger acceptance guarantee, and for work that changes a company's files, acceptance is the harder half. A team with nobody to operate a cluster can still start a session and review a diff.

Auditability takes the same shape. Every action is recorded. Reading, exporting and streaming the audit log depend on the plan. A manager who has to answer "what did it do last Tuesday" gets a list of actions and a branch to inspect, rather than a reconstruction from logs.

Kortix is an AI Operating System, and its session, branch, change request and triggers are what make an agent's work survive long enough to be judged.

## Your scheduler starts the session, the change request ends it

The two halves compose with very little glue. A trigger starts a session with nobody present. There are four kinds. A cron trigger fires on a schedule slot, or once at a time you choose. A webhook fires on a signed POST. An event trigger fires when something happens in a connected app, and a monitor fires when a command in your repo prints a line on stdout. Each one is a way for a system you already run to hand work to an agent ([triggers docs](https://kortix.com/docs/connect/triggers)).

Your existing scheduler keeps its job list. Its last step becomes a signed POST, and the session does the part a scheduler was never good at: read the repo, write the change, run the checks. A cron entry covers the cases where the scheduler is missing entirely.

```yaml
triggers:
  - slug: daily-digest
    type: cron
    cron: "0 0 9 * * 1-5"
    timezone: Europe/Berlin
    prompt: Summarize yesterday's commits and open change requests.
```

The return path is the change request. Your pipeline reads it, runs its own gates against the branch, then merges or closes it. The engine never has to know how a file was edited. It only has to know that a step finished, and the change request is that step's result. If the work continues after the merge, the engine's next step starts from the commit that landed.

For a longer treatment of each side, see [durable execution engines](/durable-execution-engine) and [durable execution for AI agents](/durable-execution-for-ai-agents). The pattern appears in [Kortix's blog](https://kortix.com/blog/how-to-build-reliable-ai-agent-workflows).

## Three situations, three tools

- **A ninety-day timer, or a payment flow across four services, with no agent involved:** Temporal or Restate.
- **An agent that edits a repo, and a person who approves the edit:** Kortix.
- **A pipeline that must hand work to an agent and get a reviewable change back:** your engine starts the session; Kortix returns the change request.

Which tool gets the file matters more than which tool is better. When the file is the deliverable and a person signs it off, the platform that produces a reviewable change does the work that matters. The engine is the thing that starts it on time.

## Questions that decide the choice

### What is durable execution temporal?

It is Temporal's own description of its product, crash-proof execution. Temporal records a workflow's state at every step, so after a failure the workflow picks up where it stopped instead of starting again.

### Who are the main competitors of Temporal?

Restate, Inngest, Trigger.dev, DBOS, Hatchet and Microsoft's Durable Task are the closest. Cloudflare Workflows and AWS Step Functions compete from the managed side, with no self-host edition. Restate positions itself directly against Temporal.

### Is Netflix using temporal?

Not on Temporal's public customer list. Its own site, checked October 2026, names OpenAI, NVIDIA, Salesforce, Twilio and Descript, and not Netflix.

### Does Kortix replace a workflow engine?

No. Kortix replaces the review step. A session commits, pushes a branch and opens a change request a person merges. Keep an engine for multi-service orchestration, deterministic replay and timers measured in months.

## Start with one change request.

Point an agent at a repo, let it open the change, then review the diff and the checks yourself.

[Try Kortix](https://kortix.com) · [Read the docs](https://kortix.com/docs)

Self-host is free · Read it, fork it, audit it · Every action is recorded. Reading, exporting and streaming the audit log depend on the plan
