Module: FlowEngine::LLM::SensitiveDataFilter

Defined in:
lib/flowengine/llm/sensitive_data_filter.rb

Overview

Scans introduction text for sensitive data patterns (SSN, ITIN, EIN, bank account numbers) and raises SensitiveDataError if any are found. This prevents sensitive information from being sent to an LLM.

Constant Summary collapse

SSN_PATTERN =

SSN: 3 digits, dash, 2 digits, dash, 4 digits (e.g. 123-45-6789)

/\b\d{3}-\d{2}-\d{4}\b/
ITIN_PATTERN =

ITIN: 9XX-XX-XXXX where first digit is 9

/\b9\d{2}-\d{2}-\d{4}\b/
EIN_PATTERN =

EIN: 2 digits, dash, 7 digits (e.g. 12-3456789)

/\b\d{2}-\d{7}\b/
NINE_DIGITS_PATTERN =

Nine consecutive digits (SSN/ITIN without dashes)

/\b\d{9}\b/
PATTERNS =
{
  "SSN" => SSN_PATTERN,
  "ITIN" => ITIN_PATTERN,
  "EIN" => EIN_PATTERN,
  "SSN/ITIN (no dashes)" => NINE_DIGITS_PATTERN
}.freeze

Class Method Summary collapse

Class Method Details

.check!(text) ⇒ Object

Checks text for sensitive data patterns.

Raises:

  • (SensitiveDataError) —

    if any sensitive patterns are detected



32
33
34
35
36
37
38
39
40
41
42
# File 'lib/flowengine/llm/sensitive_data_filter.rb', line 32

def self.check!(text)
  detected = PATTERNS.each_with_object([]) do |(label, pattern), found|
    found << label if text.match?(pattern)
  end

  return if detected.empty?

  raise ::FlowEngine::Errors::SensitiveDataError,
        "Introduction contains sensitive information (#{detected.join(", ")}). " \
        "Please remove all SSN, ITIN, EIN, and account numbers before proceeding."
end