Class: Phronomy::Agent::JournalRecord

Inherits:
Object
  • Object
show all
Defined in:
lib/phronomy/agent/journal_record.rb

Overview

One immutable entry in the Agent's append-only Canonical Complete Execution Log.

Raw logical execution facts are never rewritten for Context selection or compaction. Derived Context artifacts must be appended separately and keep stable provenance back to their raw source records.

Constant Summary collapse

ATTRIBUTES =
%i[
  record_id agent_id sequence execution_id llm_call_id kind channel role content_ref
  parent_id causation_id correlation_id visibility context_generation
  context_candidate occurred_at metadata
].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(agent_id:, kind:, channel:, record_id: SecureRandom.uuid, sequence: nil, execution_id: nil, llm_call_id: nil, role: nil, content_ref: nil, parent_id: nil, causation_id: nil, correlation_id: nil, visibility: :agent, context_generation: 0, context_candidate: false, occurred_at: Time.now.utc.iso8601(6), metadata: {}) ⇒ JournalRecord

Returns a new instance of JournalRecord.



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/phronomy/agent/journal_record.rb', line 22

def initialize(
  agent_id:,
  kind:,
  channel:,
  record_id: SecureRandom.uuid,
  sequence: nil,
  execution_id: nil,
  llm_call_id: nil,
  role: nil,
  content_ref: nil,
  parent_id: nil,
  causation_id: nil,
  correlation_id: nil,
  visibility: :agent,
  context_generation: 0,
  context_candidate: false,
  occurred_at: Time.now.utc.iso8601(6),
  metadata: {}
)
  values = binding.local_variables.to_h { |name| [name, binding.local_variable_get(name)] }
  ATTRIBUTES.each do |name|
    value = values.fetch(name)
    value = value.to_sym if %i[kind channel role visibility].include?(name) && value
    instance_variable_set("@#{name}", Immutable.copy(value))
  end
  Immutable.validate_canonical_json!(, label: "Journal metadata")
  freeze
end

Class Method Details

.from_h(hash) ⇒ Object



59
60
61
62
63
64
# File 'lib/phronomy/agent/journal_record.rb', line 59

def self.from_h(hash)
  new(**ATTRIBUTES.to_h do |name|
    key = hash.key?(name.to_s) ? name.to_s : name
    [name, hash[key]]
  end)
end

Instance Method Details

#to_hObject



55
56
57
# File 'lib/phronomy/agent/journal_record.rb', line 55

def to_h
  ATTRIBUTES.to_h { |name| [name.to_s, public_send(name)] }
end

#with_sequence(sequence) ⇒ Object



51
52
53
# File 'lib/phronomy/agent/journal_record.rb', line 51

def with_sequence(sequence)
  self.class.from_h(to_h.merge("sequence" => sequence))
end