# `Snodo.Extensions.Tasks.Event`
[🔗](https://github.com/joshrotenberg/snodo/blob/v0.1.0/extensions/tasks/lib/snodo/extensions/tasks/event.ex#L1)

A validated, versioned state-transition intent for a protocol Task.

Events contain data only. They can cross a process, database, or remote-store
boundary without asking the store to execute application closures. Event IDs
are stable across compare-and-set retries; idempotency remains the store's
responsibility.

# `kind`

```elixir
@type kind() ::
  :input_requested
  | :input_responses_accepted
  | :retry_requested
  | :completed
  | :failed
  | :cancelled
```

# `t`

```elixir
@type t() :: %Snodo.Extensions.Tasks.Event{
  data: map(),
  id: String.t(),
  kind: kind(),
  version: pos_integer()
}
```

# `cancelled`

```elixir
@spec cancelled(keyword()) :: {:ok, t()} | {:error, term()}
```

# `completed`

```elixir
@spec completed(map(), keyword()) :: {:ok, t()} | {:error, term()}
```

# `failed`

```elixir
@spec failed(map(), String.t() | nil, keyword()) :: {:ok, t()} | {:error, term()}
```

# `from_map`

```elixir
@spec from_map(term()) :: {:ok, t()} | {:error, term()}
```

Decodes and validates a persistence map produced by `to_map/1`.

# `generate_id`

```elixir
@spec generate_id() :: String.t()
```

# `input_requested`

```elixir
@spec input_requested(String.t(), map(), keyword()) :: {:ok, t()} | {:error, term()}
```

# `input_responses_accepted`

```elixir
@spec input_responses_accepted(map(), keyword()) :: {:ok, t()} | {:error, term()}
```

# `retry_requested`

```elixir
@spec retry_requested(map(), String.t() | nil, keyword()) ::
  {:ok, t()} | {:error, term()}
```

Requests the next persisted retry delay or terminal failure on exhaustion.

# `to_map`

```elixir
@spec to_map(t()) :: map()
```

Encodes an event as a stable JSON-safe persistence map.

# `validate`

```elixir
@spec validate(t()) :: :ok | {:error, term()}
```

Validates an event constructed locally or by an adapter.

---

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