Fix five latent bugs from temporal-precision code review
1. parse_salience_100: handle 3+ decimal digit salience strings correctly.
The two-branch 'else { stripped }' case treated any N-digit decimal value
as hundredths, so "0.125" (stripped=125) clamped to 100 instead of 12.
Now divides by 10^(N-2) for N>2, mapping "0.125"->12, "0.375"->37, etc.
2. mem_consolidate Canonical scan: replaced single engram_scan_nodes_json(50,0)
call with a paginated loop (page_size=50, advancing offset) so Canonical nodes
beyond index 50 are no longer silently excluded from the periodic boost.
3. mem_consolidate Canonical strengthening: add salience ceiling guard so nodes
already at the runtime maximum (serialised as "1" by %g) are skipped. Prevents
monotonic unbounded salience growth across successive consolidation passes.
4. soul.el affective cutoff: replaced json_get(aff_node, "ts") with
json_get(aff_node, "created_at") / "updated_at" fallback, consistent with
handle_chat. The old "ts" field is not a standard engram node field; missing
it caused the fallback to ts_now (always passes cutoff), over-including stale
nodes. New behaviour defaults to 0 on missing timestamps (conservative exclude).
5. History byte-cap: implemented the existing TODO 32KB byte-cap. Added
hist_trim_to_byte_cap() and applied it after count-based trim in both
handle_chat and handle_chat_agentic. Prevents 100KB+ state entries at 40 turns
during long technical sessions with large assistant responses.
This commit is contained in:
@@ -186,8 +186,20 @@ fn load_identity_context() -> Void {
|
||||
while ai < aff_total {
|
||||
let aff_node: String = json_array_get(affective_raw, ai)
|
||||
let aff_content: String = json_get(aff_node, "content")
|
||||
let aff_ts_str: String = json_get(aff_node, "ts")
|
||||
let aff_ts: Int = if str_eq(aff_ts_str, "") { ts_now } else { str_to_int(aff_ts_str) }
|
||||
// Use created_at (the standard engram node timestamp field), consistent
|
||||
// with handle_chat which reads created_at / updated_at. The previous
|
||||
// field name "ts" is not a standard engram field: it was present in some
|
||||
// BellEvent content payloads but absent from standard engram node JSON,
|
||||
// causing json_get to return "" and the fallback to ts_now — meaning ALL
|
||||
// nodes with a missing "ts" field appeared recent, over-including stale
|
||||
// content. With the 14-day window, this amplification was significant.
|
||||
// Fix: read created_at first, fall back to updated_at, then default to 0
|
||||
// (same as handle_chat). A ts of 0 always fails the cutoff check, so nodes
|
||||
// missing both timestamp fields are conservatively excluded rather than
|
||||
// blindly included.
|
||||
let aff_ca: String = json_get(aff_node, "created_at")
|
||||
let aff_ts_str: String = if str_eq(aff_ca, "") { json_get(aff_node, "updated_at") } else { aff_ca }
|
||||
let aff_ts: Int = if str_eq(aff_ts_str, "") { 0 } else { str_to_int(aff_ts_str) }
|
||||
let is_recent: Bool = aff_ts >= ts_cutoff
|
||||
let snip: String = if str_len(aff_content) > 200 { str_slice(aff_content, 0, 200) } else { aff_content }
|
||||
let aff_ctx = if is_recent && !str_eq(snip, "") {
|
||||
|
||||
Reference in New Issue
Block a user