# `Excessibility.Review.Behavioral`
[🔗](https://github.com/lessthanseventy/excessibility/blob/v0.18.1/lib/excessibility/review/behavioral.ex#L1)

Behavioral findings for a review, drawn from the telemetry timeline.

A DOM diff sees what the page *looks* like; it can't see an N+1 query, a
dead assign, render thrash, or a state-machine regression. Those live in
the telemetry timeline captured during the test run. This module runs the
timeline analyzers (the same ones behind `mix excessibility.debug`) and
normalizes their findings into the review's finding shape, so a judge can
weigh behavior alongside markup.

Analyzer severities (`:info | :warning | :critical`) are mapped onto the
review scale (`:minor | :moderate | :serious`).

# `finding`

```elixir
@type finding() :: %{
  rule: atom(),
  severity: :serious | :moderate | :minor,
  message: String.t(),
  source: :telemetry,
  events: list()
}
```

# `findings`

```elixir
@spec findings(
  map(),
  keyword()
) :: [finding()]
```

Run the analyzers over a parsed `timeline` and return normalized findings.

`opts[:analyzers]` selects analyzer modules (default: the registry's
default-enabled analyzers). Remaining opts are passed through to each
analyzer.

---

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