From f4b1508cf57001c3f2068595ac35e26d793da759 Mon Sep 17 00:00:00 2001 From: Neeraj Sathish Kumar Date: Mon, 4 May 2026 12:22:14 +0530 Subject: [PATCH] fix: prevent false forget receipts and redaction resurrection --- src/runtime/consolidation.rs | 15 +++++++++++++++ src/runtime/governance.rs | 28 ++++++++++++++++++++++++---- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/runtime/consolidation.rs b/src/runtime/consolidation.rs index 9b38c9d..978f17d 100644 --- a/src/runtime/consolidation.rs +++ b/src/runtime/consolidation.rs @@ -75,6 +75,21 @@ where ingest.source_message_ids = messages.iter().map(|message| message.id.clone()).collect(); ingest.importance_score = 1.0; ingest.confidence_score = Some(1.0); + + let memory_id = deterministic_id(&[ + &request.tenant_id, + &request.user_id, + &request.session_id, + &ingest.content, + ]); + if let Some(existing) = store.get_memory(&request.tenant_id, &request.user_id, &memory_id)? { + if existing.status != crate::memory::MemoryStatus::Active { + return Err(CoreError::InvalidInput( + "cannot consolidate into a non-active forgotten memory".to_string(), + )); + } + } + let accepted = vec![ingest_memory(store, ingest)?]; let now = now_timestamp(); let job = RuntimeJob { diff --git a/src/runtime/governance.rs b/src/runtime/governance.rs index 951556b..ac5f06a 100644 --- a/src/runtime/governance.rs +++ b/src/runtime/governance.rs @@ -47,10 +47,30 @@ pub fn forget_memory( "mark_deleted_or_redacted", Some(request.memory_id.clone()), ), - StoreReceipt::ok("qdrant", "delete_point", Some(request.memory_id.clone())), - StoreReceipt::ok("neo4j", "redact_edges", Some(request.memory_id.clone())), - StoreReceipt::ok("redis", "invalidate_cache", Some(request.memory_id.clone())), - StoreReceipt::ok("s3", "append_tombstone_manifest", Some(request.memory_id)), + StoreReceipt { + backend: "qdrant".to_string(), + operation: "delete_point".to_string(), + target_id: Some(request.memory_id.clone()), + status: "not_implemented".to_string(), + }, + StoreReceipt { + backend: "neo4j".to_string(), + operation: "redact_edges".to_string(), + target_id: Some(request.memory_id.clone()), + status: "not_implemented".to_string(), + }, + StoreReceipt { + backend: "redis".to_string(), + operation: "invalidate_cache".to_string(), + target_id: Some(request.memory_id.clone()), + status: "not_implemented".to_string(), + }, + StoreReceipt { + backend: "s3".to_string(), + operation: "append_tombstone_manifest".to_string(), + target_id: Some(request.memory_id), + status: "not_implemented".to_string(), + }, ], }) }