engram tiered storage: engram-service wiring + elc fold-hang fix + prune-store mirror

- Wire paged store into the ENGRAM SERVICE (server.el, the authoritative durable
  owner): boot->engram_store_boot, persist_canonical->engram_store_checkpoint,
  gated by ENGRAM_STORE.
- elc (lang/elc.c + src/parser.el + codegen.el + elc-combined.el): OOB guard in
  tok_kind/tok_value + parse_block progress backstop — fixes the pre-existing
  unbounded-memory fold hang on sessions.el.
- engram_prune_telemetry mirrors ISE prune to the store (store_forget) so store
  live-count tracks resident and stale telemetry stays bounded.
- Deployed live 2026-08-12: engram :8742 on neuron.egm+WAL, count reconciled 11552.
This commit is contained in:
2026-08-12 14:14:20 -05:00
parent 9a0266cbf9
commit bb64a236ed
7 changed files with 263 additions and 26 deletions
+60 -3
View File
@@ -1292,6 +1292,43 @@ fn next_if_id() -> String {
native_int_to_str(n)
}
// is_void_builtin true for runtime builtins declared `void` in el_runtime.h.
// User `-> Void` functions are emitted as el_val_t (return 0) so they are safe
// to assign; only these C-level void builtins are not.
fn is_void_builtin(name: String) -> Bool {
if str_eq(name, "println") { return true }
if str_eq(name, "print") { return true }
if str_eq(name, "engram_strengthen") { return true }
if str_eq(name, "engram_forget") { return true }
if str_eq(name, "engram_connect") { return true }
if str_eq(name, "dharma_emit") { return true }
if str_eq(name, "dharma_strengthen") { return true }
if str_eq(name, "llm_register_tool") { return true }
if str_eq(name, "exit_program") { return true }
if str_eq(name, "http_serve") { return true }
if str_eq(name, "http_set_handler") { return true }
if str_eq(name, "http_serve_async") { return true }
if str_eq(name, "el_cgi_init") { return true }
if str_eq(name, "el_retain") { return true }
if str_eq(name, "el_release") { return true }
false
}
// cg_expr_is_void true if `val` is a direct call to a void builtin, so the
// if-expression arm must emit it as a bare statement rather than assigning its
// (nonexistent) value to the result var.
fn cg_expr_is_void(val: Map<String, Any>) -> Bool {
let vk: String = val["expr"]
if str_eq(vk, "Call") {
let f = val["func"]
let fk: String = f["expr"]
if str_eq(fk, "Ident") {
return is_void_builtin(f["name"])
}
}
false
}
// Render a single arm of the if-as-expression: emit each statement-before-last
// as a side-effecting expression, then assign the final Expr's value to the
// result var. If the arm body is empty or its last stmt isn't an Expr, the
@@ -1300,6 +1337,10 @@ fn cg_if_expr_arm(stmts: [Map<String, Any>], result_var: String) -> String {
let n: Int = native_list_len(stmts)
// Collect statement fragments into a list to avoid O(n-) string growth.
let parts: [String] = native_list_empty()
// Track names already declared in this arm's C block. El permits `let x`
// to redeclare/rebind x in the same scope, but C forbids redeclaring the
// same name in one block: emit `el_val_t x = ...` first, `x = ...` after.
let declared: [String] = native_list_empty()
let i = 0
while i < n {
let s = native_list_get(stmts, i)
@@ -1310,18 +1351,31 @@ fn cg_if_expr_arm(stmts: [Map<String, Any>], result_var: String) -> String {
let name: String = s["name"]
let val = s["value"]
let val_c: String = cg_expr(val)
let parts = native_list_append(parts, "el_val_t " + name + " = " + val_c + "; ")
if list_contains(declared, name) {
let parts = native_list_append(parts, name + " = " + val_c + "; ")
} else {
let declared = native_list_append(declared, name)
let parts = native_list_append(parts, "el_val_t " + name + " = " + val_c + "; ")
}
} else {
if str_eq(sk, "Return") {
let val = s["value"]
let val_c: String = cg_expr(val)
let parts = native_list_append(parts, result_var + " = (" + val_c + "); ")
if cg_expr_is_void(val) {
let parts = native_list_append(parts, val_c + "; ")
} else {
let parts = native_list_append(parts, result_var + " = (" + val_c + "); ")
}
} else {
if str_eq(sk, "Expr") {
let val = s["value"]
let val_c: String = cg_expr(val)
if is_last {
let parts = native_list_append(parts, result_var + " = (" + val_c + "); ")
if cg_expr_is_void(val) {
let parts = native_list_append(parts, val_c + "; ")
} else {
let parts = native_list_append(parts, result_var + " = (" + val_c + "); ")
}
} else {
let parts = native_list_append(parts, "(void)(" + val_c + "); ")
}
@@ -2669,6 +2723,9 @@ fn builtin_arity(name: String) -> Int {
if str_eq(name, "engram_activate") { return 2 }
if str_eq(name, "engram_save") { return 1 }
if str_eq(name, "engram_load") { return 1 }
if str_eq(name, "engram_store_boot") { return 1 }
if str_eq(name, "engram_store_checkpoint") { return 0 }
if str_eq(name, "engram_store_close") { return 0 }
if str_eq(name, "engram_get_node_json") { return 1 }
if str_eq(name, "engram_search_json") { return 2 }
if str_eq(name, "engram_scan_nodes_json") { return 2 }