fix(reliability): state-management — document and partially fix concurrent state races
Neuron Soul CI / build (pull_request) Has been cancelled
Neuron Soul CI / build (pull_request) Has been cancelled
Issues addressed: - #2: Document session_index non-atomic RMW (engram node safe under new mutex) - #3: Document conv_history global race in handle_chat (session path unaffected) - #4: Scope session_continuity state key per session_id in layered_cycle - #5: Document active_imprint_id global race with fix path - #6: Fix next_bridge_id to use uuid_v4() for collision-free IDs - #7: Document session_hist_save delete-then-insert race - #8: Document /api/graph/edges engram_save race (fixed in el_runtime.c) - #10: Document agentic_conv_history global race in awareness loop Issues #1 (engram_global mutex) and #8 (atomic engram_save write-to-temp+rename) are fully fixed in el_runtime.c (committed to foundation/el repo separately). Issue #9 skipped — already fixed in PR #31.
This commit is contained in:
@@ -275,6 +275,8 @@ fn handle_chat(body: String) -> String {
|
||||
}
|
||||
|
||||
// Load history BEFORE compiling context so we can anchor activation to the thread.
|
||||
// TODO(reliability #3 — conv_history global race): process-global key; concurrent
|
||||
// /api/chat requests without session_id race on this read-append-write.
|
||||
let state_hist: String = state_get("conv_history")
|
||||
let stored_hist: String = if str_eq(state_hist, "") { conv_history_load() } else { state_hist }
|
||||
let hist_len: Int = if str_eq(stored_hist, "") { 0 } else { json_array_len(stored_hist) }
|
||||
@@ -802,15 +804,18 @@ fn is_builtin_tool(tool_name: String) -> Bool {
|
||||
|| str_starts_with(tool_name, "neuron_")
|
||||
}
|
||||
|
||||
// next_bridge_id — monotonic correlation id for a suspended agentic turn.
|
||||
// Combines boot-relative time with a per-process counter so two unknown-tool
|
||||
// suspensions in the same second still get distinct ids.
|
||||
// next_bridge_id — unique correlation id for a suspended agentic turn.
|
||||
// Uses uuid_v4() as the primary uniqueness guarantee — concurrent calls cannot collide.
|
||||
//
|
||||
// TODO(reliability #6): mcp_bridge_seq RMW is non-atomic. Now benign because
|
||||
// uuid_v4() provides collision-free uniqueness. Counter is kept for readability only.
|
||||
fn next_bridge_id() -> String {
|
||||
let prev: String = state_get("mcp_bridge_seq")
|
||||
let n: Int = if str_eq(prev, "") { 0 } else { str_to_int(prev) }
|
||||
let next: Int = n + 1
|
||||
state_set("mcp_bridge_seq", int_to_str(next))
|
||||
return "br-" + int_to_str(time_now()) + "-" + int_to_str(next)
|
||||
let uid: String = uuid_v4()
|
||||
return "br-" + uid
|
||||
}
|
||||
|
||||
fn handle_chat_agentic(body: String) -> String {
|
||||
|
||||
Reference in New Issue
Block a user