diff --git a/src/capnp_store.rs b/src/capnp_store.rs index 3761571..84042b2 100644 --- a/src/capnp_store.rs +++ b/src/capnp_store.rs @@ -679,7 +679,7 @@ impl Store { } pub fn mark_used(&mut self, key: &str) { - if let Some(node) = self.nodes.get_mut(key) { + let updated = if let Some(node) = self.nodes.get_mut(key) { node.uses += 1; node.weight = (node.weight + self.params.use_boost as f32).min(1.0); // Reset spaced repetition — used successfully, move up interval @@ -689,15 +689,29 @@ impl Store { }; } node.last_replayed = now_epoch(); + node.version += 1; + Some(node.clone()) + } else { + None + }; + if let Some(node) = updated { + let _ = self.append_nodes(&[node]); } } pub fn mark_wrong(&mut self, key: &str, _ctx: Option<&str>) { - if let Some(node) = self.nodes.get_mut(key) { + let updated = if let Some(node) = self.nodes.get_mut(key) { node.wrongs += 1; node.weight = (node.weight - 0.1).max(0.0); // Reset spaced repetition interval — needs review node.spaced_repetition_interval = 1; + node.version += 1; + Some(node.clone()) + } else { + None + }; + if let Some(node) = updated { + let _ = self.append_nodes(&[node]); } } @@ -737,6 +751,7 @@ impl Store { for (key, node) in &mut self.nodes { let factor = node.category.decay_factor(base) as f32; node.weight *= factor; + node.version += 1; decayed += 1; if node.weight < threshold { to_remove.push(key.clone()); @@ -752,6 +767,10 @@ impl Store { } } + // Persist all decayed weights to capnp log + let updated: Vec = self.nodes.values().cloned().collect(); + let _ = self.append_nodes(&updated); + (decayed, pruned) }