# `WorkflowStem.EngineBehaviour`
[🔗](https://github.com/fosferon/workflow_stem/blob/main/lib/workflow_stem/engine_behaviour.ex#L1)

Behaviour contract for stem engines.

Engines must be deterministic under `sync: true` execution, enabling
reliable unit tests and debugging.

# `checkpoint`

```elixir
@callback checkpoint(WorkflowStem.Types.runtime()) :: map()
```

# `get_state`

```elixir
@callback get_state(WorkflowStem.Types.runtime()) :: WorkflowStem.Projection.t() | map()
```

# `handle_event`

```elixir
@callback handle_event(
  WorkflowStem.Types.runtime(),
  WorkflowStem.Types.event(),
  WorkflowStem.Types.payload()
) ::
  {:ok, WorkflowStem.Types.runtime()}
  | {:wait, WorkflowStem.Types.runtime(), WorkflowStem.Types.wait_cfg()}
  | {:error, WorkflowStem.Types.reason(), WorkflowStem.Types.runtime()}
```

# `init`

```elixir
@callback init(WorkflowStem.Types.spec(), WorkflowStem.Types.runtime_context()) ::
  {:ok, WorkflowStem.Types.runtime()}
  | {:wait, WorkflowStem.Types.runtime(), WorkflowStem.Types.wait_cfg()}
  | {:error, WorkflowStem.Types.reason()}
  | {:error,
     {:initial_entry_action_failed, WorkflowStem.Types.reason(),
      WorkflowStem.Types.runtime()}}
```

# `restore`

```elixir
@callback restore(WorkflowStem.Types.spec(), map(), WorkflowStem.Types.runtime_context()) ::
  {:ok, WorkflowStem.Types.runtime()} | {:error, WorkflowStem.Types.reason()}
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
