{"repo":"NousResearch/hermes-agent","public_id":"45421","display_label":"Matrix HTML sanitizer missing table tag allowlist","summary":"A bug was reported and multiple fixes proposed for table-related HTML tags being absent from the Matrix HTML sanitizer's ALLOWED_TAGS list, causing markdown tables to be stripped. The members consistently address this single missing-allowlist issue.","subsystem":"gateway","counts":{"members":4,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":2},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":45631,"merged_at":"2026-06-13T13:57:09+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-06-13T13:57:09+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.5},"fix_edges":[{"issue_number":45421,"pr_number":45631,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-06-13T13:57:09+00:00"}],"members":[{"kind":"issue","number":45421,"title":"[Bug]: markdown tables stripped by _MatrixHtmlSanitizer — table tags missing from ALLOWED_TAGS","url":null,"state":"closed"},{"kind":"pr","number":45431,"title":"fix(matrix): preserve markdown table structure","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#45631","number":45631}],"category":"merged_via","implication":"superseded"},"merged":false},{"kind":"pr","number":45530,"title":"fix: add missing HTML table tags to Matrix sanitizer allowlist","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#45631","number":45631}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":45631,"title":"fix(matrix): preserve markdown table structure","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/platforms/matrix.py","tests/gateway/test_matrix.py"],"fix_hunks":[{"file":"gateway/platforms/matrix.py","hunks":["@@ -209,7 +209,7 @@ class _MatrixHtmlSanitizer(HTMLParser):\n     _ALLOWED_TAGS = {\n         \"a\", \"b\", \"blockquote\", \"br\", \"code\", \"del\", \"em\", \"h1\", \"h2\", \"h3\",\n         \"h4\", \"h5\", \"h6\", \"hr\", \"i\", \"li\", \"ol\", \"p\", \"pre\", \"s\", \"strike\",\n-        \"strong\", \"ul\",\n+        \"strong\", \"table\", \"tbody\", \"td\", \"th\", \"thead\", \"tr\", \"ul\",\n     }\n     _VOID_TAGS = {\"br\", \"hr\"}\n "]},{"file":"tests/gateway/test_matrix.py","hunks":["@@ -1090,6 +1090,24 @@ def test_matrix_markdown_preserves_code_fences(self):\n         assert \"<code\" in result\n         assert \"print\" in result\n \n+    def test_matrix_markdown_preserves_table_structure(self):\n+        table = \"\\n\".join(\n+            [\n+                \"| Item | Quantity |\",\n+                \"| --- | --- |\",\n+                \"| Apples | 4 |\",\n+                \"| Bread | 1 |\",\n+            ]\n+        )\n+\n+        result = self.adapter._markdown_to_html(table)\n+\n+        assert \"<table>\" in result\n+        assert \"<thead>\" in result\n+        assert \"<tbody>\" in result\n+        assert \"<th>Item</th>\" in result\n+        assert \"<td>Apples</td>\" in result\n+\n \n # ---------------------------------------------------------------------------\n # Helper: display name extraction\n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}