# `Mob.Invariant.Violation`
[🔗](https://github.com/genericjam/mob/blob/master/lib/mob/invariant/violation.ex#L1)

One confirmed invariant breach.

`details` carries **no application state** — pids, module names and counts
only. A violation is written to ETS and is a defect-report input, and the sink
policy in `decisions/2026-09-04-defect-reports-are-a-shipped-feature.md`
excludes assigns by default. The same rule `Mob.Agent.Receipt` follows, for
the same reason: MOB-147 found a `SecureField` value crossing screens, so
anything that serialises framework state has to assume secrets are in it.

# `t`

```elixir
@type t() :: %Mob.Invariant.Violation{
  at: Mob.Invariant.point(),
  details: map(),
  invariant: atom(),
  monotonic_us: integer(),
  screen: module() | nil,
  severity: Mob.Invariant.severity()
}
```

# `describe`

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

A one-line summary for a triage log.

---

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