fix(emotional-recall): resolve all remaining code review issues
Issue 1: declare affective_boot_block in build_system_prompt by reading soul_affective_context from state — the variable was used in the return statement but never assigned, causing a runtime undefined-variable error on every call. Issue 2: add missing closing brace for the hard_bell if-block in handle_chat_agentic — the absent '}' made the entire function body after the return syntactically invalid. Issue 3: call safety_normalize() before matching in safety_detect_positive_level — all phrases are lowercase; without normalization "I GOT THE JOB", "Thrilled!", and "We Won" never matched. Issue 4: switch json_array_get to json_array_get_string in safety_detect_positive_level, matching the helpers used by safety_any_match and safety_count_match throughout the rest of the safety infrastructure. Issue 5: remove the explicit safety_log_bell call in handle_chat_agentic hard_bell branch — safety_screen() already logs internally, so the call produced two BellEvent nodes per hard bell on the agentic path. Issue 6: already fixed on this branch (conv_history key confirmed correct). Issue 7: emit "low" for a single positive-phrase match and "high" for two or more — the detector previously only returned "high" or "none", making the "low" branch in auto_persist and the joy:low engram tag unreachable.
This commit is contained in:
@@ -299,19 +299,31 @@ fn safety_positive_phrases() -> String {
|
||||
return "[\"thrilled\",\"so excited\",\"so happy\",\"over the moon\",\"ecstatic\",\"amazing news\",\"great news\",\"fantastic news\",\"wonderful news\",\"incredible news\",\"i got the job\",\"got accepted\",\"got in\",\"we won\",\"i won\",\"we got\",\"just got engaged\",\"getting married\",\"baby is here\",\"she said yes\",\"he said yes\",\"passed the exam\",\"aced it\",\"nailed it\",\"best day\",\"dream come true\",\"milestone\",\"promotion\",\"got promoted\",\"raise\",\"got a raise\",\"celebrating\",\"just graduated\",\"we closed\",\"launched\",\"shipped it\",\"we did it\",\"so proud\",\"proud of myself\",\"proud of us\",\"so grateful\",\"feel amazing\",\"feeling amazing\",\"feel great\",\"feeling great\",\"on top of the world\",\"life is good\",\"couldn't be happier\"]"
|
||||
}
|
||||
|
||||
// Returns "none" | "low" | "high".
|
||||
// Issue 3 fix: normalize the message before matching — all phrases in the list are
|
||||
// lowercase, and sibling functions (safety_detect_bell_level, safety_classify_hard_bell)
|
||||
// both call safety_normalize() first. Without normalization, messages like "I GOT THE JOB",
|
||||
// "Thrilled!", or "We Won" never match and silently return "none".
|
||||
// Issue 4 fix: use json_array_get_string (matching safety_any_match / safety_count_match)
|
||||
// instead of json_array_get, so phrase extraction uses the same helper everywhere.
|
||||
// Issue 7 fix: emit "low" for a single-phrase match and "high" for two or more.
|
||||
// Previously only "high" or "none" were possible, making the "low" branch in auto_persist
|
||||
// and the "joy:low" engram tag permanently unreachable.
|
||||
fn safety_detect_positive_level(message: String) -> String {
|
||||
let text: String = safety_normalize(message)
|
||||
let phrases: String = safety_positive_phrases()
|
||||
let phrases_ok: Bool = !str_eq(phrases, "") && !str_eq(phrases, "[]")
|
||||
if !phrases_ok { return "none" }
|
||||
let n: Int = json_array_len(phrases)
|
||||
let i: Int = 0
|
||||
let count: Int = 0
|
||||
while i < n {
|
||||
let phrase: String = json_array_get(phrases, i)
|
||||
if str_contains(message, phrase) {
|
||||
return "high"
|
||||
}
|
||||
let phrase: String = json_array_get_string(phrases, i)
|
||||
let count = if str_contains(text, phrase) { count + 1 } else { count }
|
||||
let i = i + 1
|
||||
}
|
||||
if count >= 2 { return "high" }
|
||||
if count == 1 { return "low" }
|
||||
return "none"
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user