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:
parent
9782365b10
commit
c5ce6e515f
2 changed files with 20 additions and 13 deletions
|
|
@ -4,8 +4,12 @@ use crate::store;
|
|||
use crate::agents::llm;
|
||||
|
||||
pub fn cmd_run_agent(agent: &str, count: usize, target: &[String], query: Option<&str>, dry_run: bool, local: bool) -> Result<(), String> {
|
||||
if dry_run {
|
||||
// Mark as agent so tool calls (e.g. poc-memory render) don't
|
||||
// pollute the user's seen set as a side effect
|
||||
// SAFETY: single-threaded at this point (CLI startup, before any agent work)
|
||||
unsafe { std::env::set_var("POC_AGENT", "1"); }
|
||||
|
||||
if dry_run {
|
||||
unsafe { std::env::set_var("POC_MEMORY_DRY_RUN", "1"); }
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -249,9 +249,13 @@ 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() {
|
||||
// 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()
|
||||
|
|
@ -262,7 +266,6 @@ pub fn cmd_render(key: &[String]) -> Result<(), String> {
|
|||
let _ = writeln!(f, "{}\t{}", ts, bare);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue