Class: SmartBrain::Governance::Briefing

Inherits:
Object
  • Object
show all
Defined in:
lib/smart_brain/governance/briefing.rb

Overview

Deterministic, citation-first briefing (mempal parity). No LLM, no DB writes — assembles purely from memory_store/event_store. Two modes:

- brief: full cognitive snapshot (summary/key_facts/evidence/entities/
unresolved/uncertainty/next_actions), every fact carries a citation.
- wake_up: minimal L0/L1 importance-ordered resume payload.

Constant Summary collapse

KEY_FACT_TYPES =
%w[decisions goals patterns].freeze

Instance Method Summary collapse

Constructor Details

#initialize(memory_store:, event_store:, config:) ⇒ Briefing

Returns a new instance of Briefing.



15
16
17
18
19
# File 'lib/smart_brain/governance/briefing.rb', line 15

def initialize(memory_store:, event_store:, config:)
  @memory_store = memory_store
  @event_store = event_store
  @config = config
end

Instance Method Details

#brief(session_id:, query: nil, scope_ids: nil, domain_id: 'legacy', scope_context: nil) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/smart_brain/governance/briefing.rb', line 21

def brief(session_id:, query: nil, scope_ids: nil, domain_id: 'legacy', scope_context: nil)
  items = memory_store.active_items(session_id: session_id, scope_ids: scope_ids)
  recent = event_store.recent_turns(session_id: session_id, limit: briefing_recent_turns)
  search_query = query || last_user_message(recent) || ''

  {
    session_id: session_id,
    domain_id: domain_id,
    scope_context: scope_context,
    summary: summary_text(session_id),
    key_facts: key_facts(items),
    evidence: evidence(session_id: session_id, scope_ids: scope_ids, query: search_query),
    entities: memory_store.entities(session_id: session_id, scope_ids: scope_ids),
    unresolved: unresolved(items),
    uncertainty: uncertainty(items),
    next_actions: next_actions(items),
    generated_at: Time.now.utc.iso8601
  }
end

#resume(query:) ⇒ Object



62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/smart_brain/governance/briefing.rb', line 62

def resume(query:)
  matches = event_store.all_turns(session_id: nil)
            .map { |t| t[:session_id] }.uniq
            .select { |sid| sid.to_s.downcase.include?(query.to_s.downcase) }
  matches.map do |sid|
    items = memory_store.active_items(session_id: sid)
    {
      session_id: sid,
      recent_decisions: items.select { |i| i[:type] == 'decisions' }.first(5).map { |i| fact_citation(i) },
      next_actions: next_actions(items)
    }
  end
end

#wake_up(session_id:, scope_ids: nil, domain_id: 'legacy', scope_context: nil) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/smart_brain/governance/briefing.rb', line 41

def wake_up(session_id:, scope_ids: nil, domain_id: 'legacy', scope_context: nil)
  items = memory_store.active_items(session_id: session_id, scope_ids: scope_ids)
  summary = memory_store.latest_summary(session_id: session_id)

  {
    session_id: session_id,
    domain_id: domain_id,
    scope_context: scope_context,
    l0: {
      identity: items.select { |i| i[:type] == 'profile' },
      principles: items.select { |i| i[:tier] == 'dao_tian' },
      preferences: items.select { |i| i[:type] == 'preferences' }
    },
    l1: {
      goals_decisions: items.select { |i| %w[goals decisions].include?(i[:type]) },
      summary: summary ? summary[:text] : nil
    },
    generated_at: Time.now.utc.iso8601
  }
end