# `Scrypath.Operator.ReasonClassCounts`
[🔗](https://github.com/szTheory/scrypath/blob/v0.3.5/lib/scrypath/operator/reason_class_counts.ex#L1)

Dense per-class counts for failed sync work rows.

`by_class` always includes exactly these keys, in this order when encoded to
JSON: `:transport`, `:validation`, `:backend_rejected`, `:queue_exhausted`,
`:unknown`. Each value is a non-negative integer.

When rollups are computed over a **filtered** row list, `total` reflects that
list only — do not compare it to an unfiltered source length without
recomputing counts on the same list you display.

# `by_class`

```elixir
@type by_class() :: %{
  transport: non_neg_integer(),
  validation: non_neg_integer(),
  backend_rejected: non_neg_integer(),
  queue_exhausted: non_neg_integer(),
  unknown: non_neg_integer()
}
```

Rollup map keyed by every `FailedWork.reason_class/0` atom.

# `t`

```elixir
@type t() :: %Scrypath.Operator.ReasonClassCounts{
  by_class: by_class(),
  total: non_neg_integer(),
  version: pos_integer()
}
```

---

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