{"repo":"NousResearch/hermes-agent","public_id":"9136","display_label":"Telegram progress message coalescing and edit reliability","summary":"These issues and PRs address bugs where Telegram tool-progress messages stop being edited in place and instead spawn separate messages, particularly after flood control responses or transient network errors. Work covers preserving edit capability across error conditions and recovering coalescing behavior.","subsystem":"gateway","counts":{"members":7,"open_issues":1,"open_issues_distinct":1,"open_prs":1,"closed_issues":2,"merged_prs":1,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":28484,"merged_at":"2026-05-19T04:58:47+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-05-19T04:58:47+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.22476190476190475},"fix_edges":[{"issue_number":25188,"pr_number":28484,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-05-19T04:58:47+00:00"}],"members":[{"kind":"issue","number":9136,"title":"[Bug]: Progress messages stop coalescing after approval — each trajectory becomes a separate message","url":null,"state":"open"},{"kind":"issue","number":25188,"title":"[Bug]: Telegram flood-control fallback stops coalescing tool progress and starts sending new messages","url":null,"state":"closed"},{"kind":"issue","number":27828,"title":"Telegram tool-progress edits permanently fall back to separate messages after transient edit_message network error","url":null,"state":"closed"},{"kind":"pr","number":9345,"title":"fix(gateway): recover progress coalescing after stale edits","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":25198,"title":"fix(gateway): keep tool-progress edits alive after Telegram flood control","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#28484","number":28484}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":27839,"title":"fix(telegram): preserve can_edit after transient network errors in progress edits (#27828)","url":null,"state":"closed","close_reason":{"category":"merged_via","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":28484,"title":"fix(gateway): keep tool-progress edits alive after Telegram flood control (closes #25188)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/run.py","scripts/release.py"],"fix_hunks":[{"file":"gateway/run.py","hunks":["@@ -15463,14 +15463,15 @@ async def _roll_progress_overflow_if_needed() -> bool:\n                         if not result.success:\n                             _err = (getattr(result, \"error\", \"\") or \"\").lower()\n                             if \"flood\" in _err or \"retry after\" in _err:\n-                                # Flood control hit — disable further edits,\n-                                # switch to sending new messages only for\n-                                # important updates.  Don't block 23s.\n+                                # Flood control hit — backoff but keep editing.\n+                                # Only disable edits for non-recoverable errors.\n                                 logger.info(\n-                                    \"[%s] Progress edits disabled due to flood control\",\n+                                    \"[%s] Progress edit flood control, backing off\",\n                                     adapter.name,\n                                 )\n-                            can_edit = False\n+                                _last_edit_ts = time.monotonic()\n+                            else:\n+                                can_edit = False\n                             _flood_result = await adapter.send(\n                                 chat_id=source.chat_id,\n                                 content=msg,"]},{"file":"scripts/release.py","hunks":["@@ -166,7 +166,7 @@\n     \"[redacted:email]\": \"Junass1\",\n     \"[redacted:email]\": \"Bartok9\",\n     \"bartok9@users.noreply.github.com\": \"Bartok9\",\n-    \"pepelax@users.noreply.github.com\": \"pepelax\",  # PR #25419 salvage (send_message TELEGRAM_PROXY)\n+    \"[redacted:email]\": \"erhnysr\",  # PR #25198 salvage (tool-progress flood-control)\n     \"[redacted:email]\": \"hllqkb\",\n     \"25840394+Bongulielmi@users.noreply.github.com\": \"Bongulielmi\",\n     \"[redacted:email]\": \"JTroyerOvermatch\",\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}