# `MingaAgent.Session.Persistence`
[🔗](https://github.com/jsmestad/minga/blob/main/lib/minga_agent/session/persistence.ex#L1)

Owns transcript save intent, timer correlation, and retry state.

Session performs each write synchronously, so a dirty flag is sufficient:
no transcript change can overtake an in-flight write. Session owns timer and
storage effects; this value only calculates bookkeeping transitions.

# `t`

```elixir
@type t() :: %MingaAgent.Session.Persistence{
  dirty?: boolean(),
  enabled?: boolean(),
  retry_count: non_neg_integer(),
  timer: timer() | nil
}
```

Focused transcript persistence bookkeeping.

# `timer`

```elixir
@type timer() :: {token :: reference(), timer_ref :: reference()}
```

A semantic timer token paired with the runtime timer reference.

# `cancel`

```elixir
@spec cancel(t()) :: {t(), timer() | nil}
```

Cancels bookkeeping for the current timer and returns its runtime effect handle.

# `changed`

```elixir
@spec changed(t()) :: {t(), timer() | nil}
```

Marks the transcript dirty and returns the timer Session must cancel.

# `dirty?`

```elixir
@spec dirty?(t()) :: boolean()
```

Returns whether the transcript has unsaved changes.

# `enabled?`

```elixir
@spec enabled?(t()) :: boolean()
```

Returns whether transcript persistence is enabled.

# `failed`

```elixir
@spec failed(t()) :: {t(), pos_integer()}
```

Records a failed write and returns the next retry delay.

# `new`

```elixir
@spec new(boolean()) :: t()
```

Creates persistence bookkeeping for one Session.

# `restored`

```elixir
@spec restored(t()) :: {t(), timer() | nil}
```

Marks a restored transcript as already persisted.

# `save_due`

```elixir
@spec save_due(t(), reference()) :: {:save, t()} | :stale
```

Consumes a due save token or rejects stale timer delivery.

# `saved`

```elixir
@spec saved(t()) :: t()
```

Records a successful synchronous write.

# `scheduled`

```elixir
@spec scheduled(t(), reference(), reference()) :: t()
```

Installs a runtime timer under its semantic delivery token.

---

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