feat(soul): add safety module, expand connectors API, memory-recall bug notes
- safety.el/.elh: new safety module - neuron-api.el, routes.el, soul.el, chat.el: connectors API expansion - regenerated dist/ C artifacts - MEMORY_RECALL_BUG.md: investigation notes Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -5,6 +5,7 @@ import "stewardship.el"
|
||||
import "imprint.el"
|
||||
import "awareness.el"
|
||||
import "chat.el"
|
||||
import "safety.el"
|
||||
import "studio.el"
|
||||
import "elp-input.el"
|
||||
import "routes.el"
|
||||
@@ -362,7 +363,21 @@ state_set("soul_engram_api_key", engram_api_key_raw)
|
||||
state_set("soul.running", "true")
|
||||
|
||||
let is_genesis: Bool = str_eq(soul_cgi_id, "ntn-genesis")
|
||||
if is_genesis {
|
||||
|
||||
// GUARD (2026-06-15): never let genesis seed over a real graph. If the in-memory load is
|
||||
// sparse but the on-disk snapshot file is large, the load FAILED — seeding+saving now would
|
||||
// clobber the user's real memory (this is exactly how the 06-14 clobber happened). Read the
|
||||
// on-disk file (local mode only) and refuse the destructive seed+save when it looks populated.
|
||||
let guard_disk: String = if str_eq(engram_url_raw, "") { fs_read(snapshot) } else { "" }
|
||||
let guard_disk_len: Int = str_len(guard_disk)
|
||||
let safe_to_seed: Bool = !(engram_node_count() < 50 && guard_disk_len > 200000)
|
||||
if is_genesis && !safe_to_seed {
|
||||
println("[soul] GUARD: loaded " + int_to_str(engram_node_count())
|
||||
+ " nodes but snapshot file is " + int_to_str(guard_disk_len)
|
||||
+ " bytes — refusing to seed/save over a real graph")
|
||||
}
|
||||
|
||||
if is_genesis && safe_to_seed {
|
||||
// Only build identity edges if the engram is fresh (< 100 edges).
|
||||
// init_soul_edges() is not idempotent — calling it on every restart
|
||||
// stacks duplicate co-value/identity edges into the snapshot.
|
||||
@@ -380,7 +395,7 @@ if is_genesis {
|
||||
|
||||
// Take a pre-serve snapshot for genesis instances — captures all boot-time graph changes
|
||||
// (identity context loading, boot counter, session-start event) before entering the serve loop.
|
||||
if is_genesis {
|
||||
if is_genesis && safe_to_seed {
|
||||
let snap: String = state_get("soul_snapshot_path")
|
||||
if !str_eq(snap, "") {
|
||||
engram_save(snap)
|
||||
|
||||
Reference in New Issue
Block a user