{"repo":"NousResearch/hermes-agent","public_id":"104653","display_label":"Duplicate inbound user turn persistence fixes","summary":"These issues and PRs address a bug where inbound user turns were being persisted twice—once by the gateway and once by the agent flush—sometimes with mismatched platform_message_id values. Fixes span deduplication logic, error recovery paths, and removal of redundant user echo persistence.","subsystem":"gateway","counts":{"members":6,"open_issues":0,"open_issues_distinct":0,"open_prs":1,"closed_issues":1,"merged_prs":2,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":105334,"merged_at":"2026-09-07T21:11:19+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-09-07T21:11:19+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.3333333333333333},"fix_edges":[{"issue_number":104653,"pr_number":104899,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-07T15:09:58+00:00"},{"issue_number":104653,"pr_number":105334,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-09-07T21:11:19+00:00"}],"members":[{"kind":"issue","number":104653,"title":"[Bug]: inbound user turns are persisted twice (gateway + agent flush); platform_message_id is set on one row and NULL on the other","url":null,"state":"closed"},{"kind":"pr","number":79610,"title":"fix(gateway): platform_message_id 数据库级去重，终止 Telegram 重试循环会话膨胀","url":null,"state":"open","close_reason":{"refs":[{"kind":"commit","value":"4ac0f01f5d","number":0},{"kind":"commit","value":"996ec74a03","number":0}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":104673,"title":"Fix inbound user turns persisted twice (gateway + agent flush)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"693641aa8b","number":0}],"category":"wontfix_bydesign","implication":"wontfix"},"merged":false},{"kind":"pr","number":104698,"title":"fix(codex): drop persisted app-server user echo","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"cd0b5b9adda8229981a48b782415b9e6de107cf4","number":0},{"kind":"commit","value":"3114916ee4bc62d45e635f6a5a289f6c40069cb0","number":0},{"kind":"pr","value":"#104899","number":104899},{"kind":"pr","value":"#93546","number":93546},{"kind":"pr","value":"#105334","number":105334}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":104899,"title":"fix(codex): accepted inputs no longer appear twice in session history (#104653)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/codex_runtime.py","agent/transports/codex_app_server_session.py","evals/codex_echo/README.md","evals/codex_echo/fixture_server.py","evals/codex_echo/probe.py","tests/agent/test_codex_echo_ownership.py","tests/agent/transports/test_codex_app_server_session.py","website/docs/developer-guide/session-storage.md"]},{"kind":"pr","number":105334,"title":"fix(gateway): error recovery no longer duplicates accepted inputs (#104653)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["agent/turn_context.py","evals/gateway_failure_ownership/README.md","evals/gateway_failure_ownership/foreign_writer.py","evals/gateway_failure_ownership/probe.py","gateway/run_turn.py","gateway/run_turn_runner.py","gateway/session_transcript.py","gateway/turn_context.py","hermes_state_messages.py","tests/gateway/test_failure_writer_ownership.py","website/docs/developer-guide/session-storage.md"]}],"trust":{"default_tier":"verified","includes_suggested":false}}