Class: Legion::Extensions::Agentic::Defense::EpistemicVigilance::Helpers::VigilanceEngine

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb

Constant Summary

Constants included from Constants

Constants::CLAIM_VERDICTS, Constants::COHERENCE_WEIGHT, Constants::CONSISTENCY_WEIGHT, Constants::DECAY_RATE, Constants::DEFAULT_SOURCE_RELIABILITY, Constants::MAX_CLAIMS, Constants::MAX_HISTORY, Constants::MAX_SOURCES, Constants::RELIABILITY_BOOST, Constants::RELIABILITY_PENALTY, Constants::SOURCE_RELIABILITY_LABELS, Constants::SOURCE_WEIGHT, Constants::VIGILANCE_LEVELS, Constants::VIGILANCE_THRESHOLDS

Instance Method Summary collapse

Constructor Details

#initializeVigilanceEngine

Returns a new instance of VigilanceEngine.



12
13
14
15
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 12

def initialize
  @sources = {}
  @claims  = {}
end

Instance Method Details

#adjudicate_claim(claim_id:, verdict:) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 76

def adjudicate_claim(claim_id:, verdict:)
  return nil unless CLAIM_VERDICTS.include?(verdict.to_sym)

  claim  = @claims[claim_id]
  source = claim && @sources[claim.source_id]
  return { error: :claim_not_found } unless claim

  claim.adjudicate!(verdict: verdict)
  update_source_on_adjudication(source, verdict)
  { claim_id: claim_id, verdict: verdict }
end

#assess_claim(claim_id:) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 35

def assess_claim(claim_id:)
  claim = @claims[claim_id]
  return { error: :claim_not_found } unless claim

  source        = @sources[claim.source_id]
  source_score  = build_source_score(source)
  consist_score = claim.credibility_ratio * CONSISTENCY_WEIGHT
  coher_score   = domain_coherence_score(claim.domain, exclude_id: claim_id)
  total         = source_score + consist_score + coher_score
  verdict       = recommended_verdict(total)

  {
    claim_id:            claim_id,
    source_score:        source_score,
    consistency_score:   consist_score,
    coherence_score:     coher_score,
    total_score:         total,
    recommended_verdict: verdict
  }
end

#challenge_claim(claim_id:) ⇒ Object



66
67
68
69
70
71
72
73
74
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 66

def challenge_claim(claim_id:)
  claim  = @claims[claim_id]
  source = claim && @sources[claim.source_id]
  return { error: :claim_not_found } unless claim

  claim.challenge!
  source&.record_refuted!
  { claim_id: claim_id, confidence: claim.confidence, evidence_against: claim.evidence_against }
end

#claims_by_domain(domain:) ⇒ Object



103
104
105
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 103

def claims_by_domain(domain:)
  @claims.values.select { |c| c.domain == domain }.map(&:to_h)
end

#claims_by_source(source_id:) ⇒ Object



99
100
101
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 99

def claims_by_source(source_id:)
  @claims.values.select { |c| c.source_id == source_id }.map(&:to_h)
end

#contested_claimsObject



95
96
97
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 95

def contested_claims
  @claims.values.select(&:contested?).map(&:to_h)
end

#decay_allObject



115
116
117
118
119
120
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 115

def decay_all
  @claims.each_value do |claim|
    claim.confidence = (claim.confidence - DECAY_RATE).clamp(0.0, 1.0)
  end
  { decayed: @claims.size }
end

#domain_vigilance_level(domain:) ⇒ Object



107
108
109
110
111
112
113
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 107

def domain_vigilance_level(domain:)
  domain_claims = @claims.values.select { |c| c.domain == domain }
  return :skeptical if domain_claims.empty?

  avg = domain_claims.sum(&:confidence) / domain_claims.size.to_f
  level_for_score(avg)
end

#prune_rejectedObject



122
123
124
125
126
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 122

def prune_rejected
  before = @claims.size
  @claims.reject! { |_, c| c.verdict == :rejected && c.confidence < 0.1 }
  { pruned: before - @claims.size, remaining: @claims.size }
end

#register_source(name:, domain:) ⇒ Object



17
18
19
20
21
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 17

def register_source(name:, domain:)
  source = Source.new(name: name, domain: domain)
  @sources[source.id] = source
  source.to_h
end

#source_reliability(source_id:) ⇒ Object



88
89
90
91
92
93
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 88

def source_reliability(source_id:)
  source = @sources[source_id]
  return { error: :source_not_found } unless source

  { source_id: source_id, reliability: source.reliability, label: source.reliability_label }
end

#submit_claim(content:, source_id:, domain:, initial_confidence: 0.5) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 23

def submit_claim(content:, source_id:, domain:, initial_confidence: 0.5)
  source = @sources[source_id]
  return { error: :source_not_found } unless source

  claim = Claim.new(content: content, source_id: source_id, domain: domain,
                    confidence: initial_confidence)
  source.instance_variable_set(:@claims_made, source.claims_made + 1)
  @claims[claim.id] = claim
  assessment = assess_claim(claim_id: claim.id)
  { claim: claim.to_h, assessment: assessment }
end

#support_claim(claim_id:) ⇒ Object



56
57
58
59
60
61
62
63
64
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 56

def support_claim(claim_id:)
  claim  = @claims[claim_id]
  source = claim && @sources[claim.source_id]
  return { error: :claim_not_found } unless claim

  claim.support!
  source&.record_verified!
  { claim_id: claim_id, confidence: claim.confidence, evidence_for: claim.evidence_for }
end

#to_hObject



128
129
130
131
132
133
134
135
# File 'lib/legion/extensions/agentic/defense/epistemic_vigilance/helpers/vigilance_engine.rb', line 128

def to_h
  {
    sources_count: @sources.size,
    claims_count:  @claims.size,
    contested:     contested_claims.size,
    by_verdict:    verdict_counts
  }
end