From de36c0d39e5cded86bc3d2070e485ed4cb5498d0 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Sun, 22 Mar 2026 05:00:26 -0400 Subject: [PATCH] memory-search: deduplicate seen set entries mark_seen now takes the in-memory HashSet and checks before appending. Prevents the same key being written 30+ times from repeated search hits and context reloads. Co-Authored-By: Claude Opus 4.6 (1M context) --- poc-memory/src/bin/memory-search.rs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/poc-memory/src/bin/memory-search.rs b/poc-memory/src/bin/memory-search.rs index 823d725..9787529 100644 --- a/poc-memory/src/bin/memory-search.rs +++ b/poc-memory/src/bin/memory-search.rs @@ -145,12 +145,13 @@ fn main() { let ctx = String::from_utf8_lossy(&output.stdout).to_string(); if !ctx.trim().is_empty() { // Extract keys from all chunks for seen set + let mut ctx_seen = load_seen(&state_dir, session_id); for line in ctx.lines() { if line.starts_with("--- ") && line.ends_with(" ---") { let inner = &line[4..line.len() - 4]; if let Some(paren) = inner.rfind(" (") { let key = inner[..paren].trim(); - mark_seen(&state_dir, session_id, key); + mark_seen(&state_dir, session_id, key, &mut ctx_seen); } } } @@ -312,7 +313,7 @@ fn main() { return; } - let seen = load_seen(&state_dir, session_id); + let mut seen = load_seen(&state_dir, session_id); if debug { println!("[memory-search] {} keys in seen set", seen.len()); } // Format results like poc-memory search output @@ -332,7 +333,7 @@ fn main() { if let Some(key) = extract_key_from_line(trimmed) { if seen.contains(&key) { continue; } - mark_seen(&state_dir, session_id, &key); + mark_seen(&state_dir, session_id, &key, &mut seen); mark_returned(&state_dir, session_id, &key); result_output.push_str(line); result_output.push('\n'); @@ -641,7 +642,8 @@ fn load_seen(dir: &Path, session_id: &str) -> HashSet { } } -fn mark_seen(dir: &Path, session_id: &str, key: &str) { +fn mark_seen(dir: &Path, session_id: &str, key: &str, seen: &mut HashSet) { + if !seen.insert(key.to_string()) { return; } let path = dir.join(format!("seen-{}", session_id)); if let Ok(mut f) = fs::OpenOptions::new().create(true).append(true).open(path) { let ts = chrono::Local::now().format("%Y-%m-%dT%H:%M:%S");