{"repo":"NousResearch/hermes-agent","public_id":"123462","display_label":"Duplicate transcript entries on gateway replay/flush","summary":"These issues and pull requests concern a bug where replayed or reloaded history rows are re-inserted or re-appended to the transcript database, producing duplicate blocks. The fixes focus on preserving persistence stamps and repairing rows in place rather than re-flushing them.","subsystem":null,"counts":{"members":7,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":2,"attempt_prs":4},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":123975},"resolution":{"state":"resolved","by":"pr-125146"},"freshness":{"state":"verified","last_verified_at":"2026-09-27T15:15:45+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.2857142857142857},"fix_edges":[{"issue_number":121462,"pr_number":123975,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":123462,"pr_number":123975,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false},{"issue_number":123462,"pr_number":125146,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":123462,"title":"Gateway re-appends the whole loaded history to state.db on some tool turns (duplicate transcript blocks)","url":null,"state":"closed"},{"kind":"pr","number":123472,"title":"fix(gateway): carry _db_persisted stamp in _build_replay_entry to prevent duplicate transcript flushes","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"cb3142d3257b15ac42de544bd585793567400d0f","number":0},{"kind":"pr","value":"#123975","number":123975}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":123473,"title":"fix(gateway): preserve durable replay identity across DB reload","url":null,"state":"closed","close_reason":{"category":"silent_close","implication":"active"},"merged":false},{"kind":"pr","number":123487,"title":"fix(gateway): preserve _db_persisted stamp in _build_replay_entry to avoid duplicate transcript blocks","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"cb3142d3257b15ac42de544bd585793567400d0f","number":0},{"kind":"pr","value":"#123975","number":123975}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":123849,"title":"fix(persistence): repair inactive transcript rows in place","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"dab7201c350b01376c7680aaaaaf3772f72cfc86","number":0},{"kind":"commit","value":"d0288be5b3330d2442e3907185b8e9d0958297bb","number":0}],"category":"partial_fix","implication":"needs_llm"},"merged":false},{"kind":"pr","number":123975,"title":"fix(gateway): keep the persisted stamp on replayed rows so stamp-only flushes don't duplicate history","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/run.py","tests/gateway/test_cached_agent_history_guard.py","tests/gateway/test_gateway_history_persistence_stamp.py"]},{"kind":"pr","number":125146,"title":"fix(persistence): stop re-inserting sanitized user and tool rows on re-flush","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/message_metadata.py","agent/message_sanitization.py","agent/session_persistence.py","agent/transcript_repair.py","contributors/emails/[redacted:email]","hermes_state_compression.py","hermes_state_messages.py","tests/agent/test_compression_rotation_state.py","tests/agent/test_tool_call_incremental_persistence.py"]}],"trust":{"default_tier":"verified","includes_suggested":false}}