Module: Legion::Extensions::Agentic::Social::Governance::Runners::ShadowAi

Defined in:
lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb

Overview

rubocop:disable Legion/Extension/RunnerIncludeHelpers

Instance Method Summary collapse

Instance Method Details

#check_airb_complianceObject



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb', line 27

def check_airb_compliance(**)
  unless defined?(Legion::Data::Model::DigitalWorker)
    Legion::Logging.debug('[governance:shadow_ai] AIRB compliance check unavailable — DigitalWorker model not loaded')
    return { checked: 0, source: :unavailable, reason: 'DigitalWorker model not loaded' }
  end

  workers = Legion::Data::Model::DigitalWorker.where(lifecycle_state: 'active').all
  non_compliant = workers.select do |w|
    risk = w.respond_to?(:risk_tier) ? w.risk_tier : nil
    %w[high critical].include?(risk) && w.respond_to?(:airb_status) && w.airb_status != 'approved'
  end

  { checked: workers.size, compliant: workers.size - non_compliant.size,
    non_compliant: non_compliant.map(&:worker_id) }
rescue StandardError => e
  { checked: 0, error: e.message }
end

#check_llm_bypass_indicatorsObject



20
21
22
23
24
25
# File 'lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb', line 20

def check_llm_bypass_indicators(**)
  indicators = []
  indicators << :direct_openai_key if ENV.key?('OPENAI_API_KEY') && !provider_enabled?(:openai)
  indicators << :direct_anthropic_key if ENV.key?('ANTHROPIC_API_KEY') && !provider_enabled?(:anthropic)
  { indicators: indicators, bypassed: !indicators.empty? }
end

#full_scanObject



45
46
47
48
49
50
51
52
53
54
# File 'lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb', line 45

def full_scan(**)
  extensions = scan_unregistered_extensions
  bypass = check_llm_bypass_indicators
  compliance = check_airb_compliance

  has_issues = extensions[:unregistered]&.any? || bypass[:bypassed] || compliance[:non_compliant]&.any?
  emit_shadow_event(extensions, bypass, compliance) if has_issues

  { extensions: extensions, bypass: bypass, compliance: compliance, issues_found: has_issues }
end

#scan_unregistered_extensionsObject



10
11
12
13
14
15
16
17
18
# File 'lib/legion/extensions/agentic/social/governance/runners/shadow_ai.rb', line 10

def scan_unregistered_extensions(**)
  installed = Bundler.load.specs.select { |s| s.name.start_with?('lex-') }.map(&:name)
  registered = registered_extension_names

  unregistered = installed - registered
  { installed: installed.size, registered: registered.size, unregistered: unregistered }
rescue StandardError => e
  { installed: 0, registered: 0, unregistered: [], error: e.message }
end