{"repo":"NousResearch/hermes-agent","public_id":"19035","display_label":"Feishu table and code block rendering fixes","summary":"Multiple attempts and approaches to fix how markdown tables and fenced code blocks are rendered in Feishu, including routing them through CardKit 2.0, native card components, and fallback modes. A related issue reports code blocks being truncated to only the first couple of lines.","subsystem":"gateway","counts":{"members":6,"open_issues":1,"open_issues_distinct":1,"open_prs":1,"closed_issues":0,"merged_prs":1,"attempt_prs":4},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":20275,"merged_at":"2026-05-05T16:57:15+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-05-05T16:57:15+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.3333333333333333},"fix_edges":[{"issue_number":9549,"pr_number":20275,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-05-05T16:57:15+00:00"},{"issue_number":19035,"pr_number":20275,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-05-05T16:57:15+00:00"}],"members":[{"kind":"issue","number":19035,"title":"[Feishu] Code blocks cannot be expanded — only first ~2 lines visible","url":null,"state":"open"},{"kind":"pr","number":19038,"title":"fix(feishu): route tables and multi-line code blocks to CardKit 2.0","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#20275","number":20275},{"kind":"pr","value":"#13723","number":13723},{"kind":"pr","value":"#19035","number":19035},{"kind":"pr","value":"#9549","number":9549}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":20275,"title":"fix(feishu): force text mode for markdown tables (salvage #13723)","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/feishu.py"],"fix_hunks":[{"file":"gateway/platforms/feishu.py","hunks":["@@ -153,6 +153,9 @@\n     r\"(^#{1,6}\\s)|(^\\s*[-*]\\s)|(^\\s*\\d+\\.\\s)|(^\\s*---+\\s*$)|(```)|(`[^`\\n]+`)|(\\*\\*[^*\\n].+?\\*\\*)|(~~[^~\\n].+?~~)|(<u>.+?</u>)|(\\*[^*\\n]+\\*)|(\\[[^\\]]+\\]\\([^)]+\\))|(^>\\s)\",\n     re.MULTILINE,\n )\n+# Detect markdown tables: a line starting with | followed by a separator line.\n+# Feishu post-type 'md' elements do not render tables, so we force text mode.\n+_MARKDOWN_TABLE_RE = re.compile(r\"^\\|.*\\|\\n\\|[-|: ]+\\|\", re.MULTILINE)\n _MARKDOWN_LINK_RE = re.compile(r\"\\[([^\\]]+)\\]\\(([^)]+)\\)\")\n _MARKDOWN_FENCE_OPEN_RE = re.compile(r\"^```([^\\n`]*)\\s*$\")\n _MARKDOWN_FENCE_CLOSE_RE = re.compile(r\"^```\\s*$\")","@@ -3995,6 +3998,12 @@ def _is_duplicate(self, message_id: str) -> bool:\n     # =========================================================================\n \n     def _build_outbound_payload(self, content: str) -> tuple[str, str]:\n+        # Feishu post-type 'md' elements do not render markdown tables; sending\n+        # table content as post causes the message to appear blank on the client.\n+        # Force plain text for anything that looks like a markdown table.\n+        if _MARKDOWN_TABLE_RE.search(content):\n+            text_payload = {\"text\": content}\n+            return \"text\", json.dumps(text_payload, ensure_ascii=False)\n         if _MARKDOWN_HINT_RE.search(content):\n             return \"post\", _build_markdown_post_payload(content)\n         text_payload = {\"text\": content}\n"]}]},{"kind":"pr","number":23861,"title":"fix(feishu): route tables and code blocks to CardKit 2.0 with post/text fallback","url":null,"state":"closed","close_reason":{"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":33310,"title":"fix(feishu): render markdown tables and code blocks via CardKit 2.0 cards","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#53453","number":53453},{"kind":"pr","value":"#53355","number":53355},{"kind":"pr","value":"#36877","number":36877}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":40445,"title":"feat(feishu): render markdown tables as native Card JSON 2.0 table components","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}