Severity-first human output: findings are grouped into an errors section,
then warnings, then (only with --verbose) informational notes, each
section headed by a count so the reader knows what to fix first. Color is
applied via IO.ANSI and disabled automatically when output is not a
terminal or NO_COLOR is set, so piped/CI logs stay plain and the golden
tests stay stable.
Summary
Functions
@spec render([Cerbero.Finding.t()], String.t(), boolean(), keyword()) :: String.t()