From 868c02fd34131d9b7337ae2f8ce2887c0cc4f67e Mon Sep 17 00:00:00 2001 From: archivr-qa Date: Mon, 24 Aug 2026 16:55:40 +0200 Subject: [PATCH] fix: hide superseded summary attempts --- crates/archivr-core/src/database.rs | 39 +++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/crates/archivr-core/src/database.rs b/crates/archivr-core/src/database.rs index 97f469c..31318e0 100644 --- a/crates/archivr-core/src/database.rs +++ b/crates/archivr-core/src/database.rs @@ -1680,8 +1680,10 @@ pub fn latest_completed_entry_summary( .map_err(Into::into) } -/// The newest replacement attempt that has not completed. This includes failed -/// rows so authenticated callers can show the failure beside a retained result. +/// The newest non-completed replacement attempt after the retained completed +/// result. This includes failed rows so authenticated callers can show a recent +/// failure beside readable content, but suppresses historical failures after a +/// newer successful regeneration. pub fn latest_entry_summary_attempt( conn: &Connection, entry_id: i64, @@ -1689,6 +1691,17 @@ pub fn latest_entry_summary_attempt( conn.query_row( &format!( "{ENTRY_SUMMARY_COLS} WHERE s.entry_id = ?1 AND s.status != 'completed' + AND ( + NOT EXISTS ( + SELECT 1 FROM entry_summaries c + WHERE c.entry_id = s.entry_id AND c.status = 'completed' + ) + OR (s.updated_at, s.id) > ( + SELECT c.updated_at, c.id FROM entry_summaries c + WHERE c.entry_id = s.entry_id AND c.status = 'completed' + ORDER BY c.completed_at DESC, c.updated_at DESC, c.id DESC LIMIT 1 + ) + ) ORDER BY s.updated_at DESC, s.id DESC LIMIT 1" ), [entry_id], @@ -4766,6 +4779,28 @@ mod tests { latest_entry_summary_attempt(&c, entry.id).unwrap().unwrap().status, "failed" ); + + let successful_replacement = + upsert_pending_entry_summary(&c, entry.id, "claude_cli", None, "v1", "newer").unwrap(); + update_entry_summary_status( + &c, + &successful_replacement, + "completed", + Some("replacement"), + None, + ) + .unwrap(); + assert_eq!( + latest_completed_entry_summary(&c, entry.id) + .unwrap() + .unwrap() + .summary_uid, + successful_replacement + ); + assert!( + latest_entry_summary_attempt(&c, entry.id).unwrap().is_none(), + "a failed attempt predating a successful replacement must not remain visible" + ); } #[test]