Closed 30-code finding registry: the single source every other module reads.
Each code has a family, a default severity, and a message function whose
text names the subject or file and the action that clears the finding.
Adding a code is a spec change in ancora.findings.
Summary
Functions
Every registry code, in declaration order.
Registry default severity for code.
Family prefix (derived, spec, …).
True when code is in the registry.
Renders the designed message for code.
Builds a finding. message is rendered from code and attrs when omitted.
The closed registry: code → %{family, default, message}.
False for config/unknown_key and config/invalid_value.
Types
@type code() :: String.t()
@type severity() :: :error | :warning | :info | :off
@type source() :: :config | :trailer | :default
Functions
@spec codes() :: [code()]
Every registry code, in declaration order.
@spec default_severity(code()) :: :error | :warning | :info
Registry default severity for code.
Family prefix (derived, spec, …).
True when code is in the registry.
Renders the designed message for code.
Context keys used across codes: :subject, :file, :requirement,
:detail, :key. Missing keys fall back to placeholders so the
registry-closure test can call every message function.
Builds a finding. message is rendered from code and attrs when omitted.
The closed registry: code → %{family, default, message}.
False for config/unknown_key and config/invalid_value.
Non-tunable codes ignore severities:, overrides:, and Spec-Ack:
trailers so a misconfigured file cannot silence the config findings it
itself produces.