Redaction Policy
data class RedactionPolicy(val sensitiveFieldNames: Set<String>, val replacement: String = "<redacted>", val textPatterns: List<Regex>)
Field matching is case-insensitive: sensitiveFieldNames is lower-cased on construction, so a caller-supplied policy naming "Authorization" behaves the same as "authorization".