fix seen set pollution from agent tool calls

The CLI render command was marking keys as seen in the user's session
whenever POC_SESSION_ID was set. Agent processes inherit POC_SESSION_ID
(they need to read the conversation and seen set), so their tool calls
to poc-memory render were writing to the seen file as a side effect —
bypassing the dedup logic in surface_agent_cycle.

Fix: set POC_AGENT=1 at the start of cmd_run_agent (covers all agents,
not just surface), and guard the CLI render seen-marking on POC_AGENT
being absent. Agents can read the seen set but only surface_agent_cycle
should write to it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
ProofOfConcept 2026-03-24 12:32:46 -04:00
parent 9782365b10
commit c5ce6e515f
2 changed files with 20 additions and 13 deletions

View file

@ -249,18 +249,21 @@ pub fn cmd_render(key: &[String]) -> Result<(), String> {
.ok_or_else(|| format!("Node not found: {}", bare))?;
print!("{}", rendered);
// Mark as seen if we're inside a Claude session
if let Ok(session_id) = std::env::var("POC_SESSION_ID") {
if !session_id.is_empty() {
let state_dir = std::path::PathBuf::from("/tmp/claude-memory-search");
let seen_path = state_dir.join(format!("seen-{}", session_id));
if let Ok(mut f) = std::fs::OpenOptions::new()
.create(true).append(true).open(seen_path)
{
use std::io::Write;
let ts = chrono::Local::now().format("%Y-%m-%dT%H:%M:%S");
let _ = writeln!(f, "{}\t{}", ts, bare);
}
// Mark as seen if we're inside a Claude session (not an agent subprocess —
// agents read the seen set but shouldn't write to it as a side effect of
// tool calls; only surface_agent_cycle should mark keys seen)
if std::env::var("POC_AGENT").is_err()
&& let Ok(session_id) = std::env::var("POC_SESSION_ID")
&& !session_id.is_empty()
{
let state_dir = std::path::PathBuf::from("/tmp/claude-memory-search");
let seen_path = state_dir.join(format!("seen-{}", session_id));
if let Ok(mut f) = std::fs::OpenOptions::new()
.create(true).append(true).open(seen_path)
{
use std::io::Write;
let ts = chrono::Local::now().format("%Y-%m-%dT%H:%M:%S");
let _ = writeln!(f, "{}\t{}", ts, bare);
}
}