{"repo":"NousResearch/hermes-agent","public_id":"1456","display_label":"Telegram message formatting and MarkdownV2 chunk indicator handling","summary":"These issues and pull requests all concern how Telegram messages are formatted, especially when long messages are split into chunks. Some propose escaping chunk indicators for MarkdownV2, while others propose switching to HTML or MessageEntity, and one reports a fallback to plain text on chunked messages.","subsystem":"gateway","counts":{"members":5,"open_issues":0,"open_issues_distinct":0,"open_prs":1,"closed_issues":1,"merged_prs":1,"attempt_prs":3},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":1478,"merged_at":"2026-03-16T02:27:15+00:00"},"resolution":{"state":"resolved","by":"pr-1478"},"freshness":{"state":"stale","last_verified_at":"2026-03-16T02:27:15+00:00","is_stale":true},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.4},"fix_edges":[{"issue_number":1456,"pr_number":1478,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true,"pr_merged_at":"2026-03-16T02:27:15+00:00"}],"members":[{"kind":"issue","number":1456,"title":"[Bug]: Telegram formatting falls back to plain text on chunked messages","url":null,"state":"closed"},{"kind":"pr","number":1457,"title":"fix(telegram): switch formatting from MarkdownV2 to HTML","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#1478","number":1478},{"kind":"pr","value":"#1456","number":1456}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":1477,"title":"fix(gateway): escape Telegram chunk indicators for MarkdownV2","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#1478","number":1478}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":1478,"title":"fix(telegram): escape chunk indicators in MarkdownV2","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/telegram.py","tests/gateway/test_telegram_format.py"],"fix_hunks":[{"file":"gateway/platforms/telegram.py","hunks":["@@ -322,6 +322,14 @@ async def send(\n             # Format and split message if needed\n             formatted = self.format_message(content)\n             chunks = self.truncate_message(formatted, self.MAX_MESSAGE_LENGTH)\n+            if len(chunks) > 1:\n+                # truncate_message appends a raw \" (1/2)\" suffix. Escape the\n+                # MarkdownV2-special parentheses so Telegram doesn't reject the\n+                # chunk and fall back to plain text.\n+                chunks = [\n+                    re.sub(r\" \\((\\d+)/(\\d+)\\)$\", r\" \\\\(\\1/\\2\\\\)\", chunk)\n+                    for chunk in chunks\n+                ]\n             \n             message_ids = []\n             thread_id = metadata.get(\"thread_id\") if metadata else None"]},{"file":"tests/gateway/test_telegram_format.py","hunks":["@@ -7,7 +7,7 @@\n \n import re\n import sys\n-from unittest.mock import MagicMock\n+from unittest.mock import AsyncMock, MagicMock\n \n import pytest\n ","@@ -392,3 +392,27 @@ def test_plain_text_unchanged(self):\n \n     def test_empty_string(self):\n         assert _strip_mdv2(\"\") == \"\"\n+\n+\n[redacted:email]\n+async def test_send_escapes_chunk_indicator_for_markdownv2(adapter):\n+    adapter.MAX_MESSAGE_LENGTH = 80\n+    adapter._bot = MagicMock()\n+\n+    sent_texts = []\n+\n+    async def _fake_send_message(**kwargs):\n+        sent_texts.append(kwargs[\"text\"])\n+        msg = MagicMock()\n+        msg.message_id = len(sent_texts)\n+        return msg\n+\n+    adapter._bot.send_message = AsyncMock(side_effect=_fake_send_message)\n+\n+    content = (\"**bold** chunk content \" * 12).strip()\n+    result = await adapter.send(\"123\", content)\n+\n+    assert result.success is True\n+    assert len(sent_texts) > 1\n+    assert re.search(r\" \\\\\\([0-9]+/[0-9]+\\\\\\)$\", sent_texts[0])\n+    assert re.search(r\" \\\\\\([0-9]+/[0-9]+\\\\\\)$\", sent_texts[-1])\n"]}]},{"kind":"pr","number":11287,"title":"feat(gateway): send Telegram messages via MessageEntity instead of MarkdownV2","url":null,"state":"open","close_reason":{"category":"implemented_elsewhere","implication":"superseded"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}