Optional finding metadata. Lives on every Finding via
#[serde(flatten)] so consumers see the fields at the top of the
finding object — same place they’d appear if declared inline on
Finding. Default-constructed extras serialize to nothing (all
Option::None and empty Vecs skip-serialize), so existing
snapshots remain byte-stable until a rule populates a field.
Provenance of a finding — distinguishes findings emitted by built-in
taudit rules from findings emitted by user-loaded custom invariant YAML
(--invariants-dir). Custom rules can emit arbitrarily-worded findings
at any severity, so an operator piping output into a JIRA workflow or
SARIF upload needs a non-spoofable signal of which file the rule came
from. Serializes as "built-in" (string) for built-in findings and
{"custom": "<path>"} for custom-rule findings — see
docs/finding-fingerprint.md for the contract.
Stable UUID v5 over the finding fingerprint. Two findings whose
fingerprints match (same rule + file + root authority) produce the
same finding_group_id — that is the whole point: SIEMs and triage
dashboards collapse N hops against a single secret into one row.
Move severity one rank toward Info (Critical -> High -> … -> Info).
Info stays Info. Used by both the suppression applicator and
compensating-control detectors.