# `Squidie.Runtime.DispatchProtocol.Projection`
[🔗](https://github.com/dark-trench/squidie/blob/main/lib/squidie/runtime/dispatch_protocol/projection.ex#L2)

Rebuildable projection over durable dispatch journal entries.

The projection is deliberately pure. Storage adapters can rebuild it from
Jido thread journals, backend lease lifecycle signals, or from a single
append-only Squidie journal table without changing the runtime invariants.

# `anomaly`

```elixir
@type anomaly() :: %{
  :reason =&gt; atom(),
  :entry_type =&gt; atom(),
  optional(:runnable_key) =&gt; String.t(),
  optional(:run_id) =&gt; String.t(),
  optional(:idempotency_key) =&gt; String.t(),
  optional(:claim_id) =&gt; String.t(),
  optional(:claim_token_hash) =&gt; String.t()
}
```

# `string_set`

```elixir
@type string_set() :: MapSet.t(String.t()) | %MapSet{map: term()}
```

# `t`

```elixir
@type t() :: %Squidie.Runtime.DispatchProtocol.Projection{
  anomalies: [anomaly()],
  attempts: %{
    optional(String.t()) =&gt; Squidie.Runtime.DispatchProtocol.ActionAttempt.t()
  },
  queued_run_ids: string_set(),
  terminal_runs: string_set()
}
```

---

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