{"repo":"NousResearch/hermes-agent","public_id":"43146","display_label":"Remove 'praxis' from C2 framework detection pattern","summary":"A bare token 'praxis' in a known C2 framework detection pattern causes false positives, particularly for German-language content and agent configuration files. These issues and fixes address removing or refining that pattern to reduce incorrect flagging.","subsystem":"agent","counts":{"members":3,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":1,"merged_prs":1,"attempt_prs":1},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":52925,"merged_at":"2026-06-26T07:36:01+00:00"},"resolution":{"state":"unresolved","by":null},"freshness":{"state":"verified","last_verified_at":"2026-06-26T07:36:01+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_SPANNING","link_density":0.6666666666666666},"fix_edges":[{"issue_number":43146,"pr_number":52925,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false,"pr_merged_at":"2026-06-26T07:36:01+00:00"}],"members":[{"kind":"issue","number":43146,"title":"Context-file scanner: bare token \"praxis\" in known_c2_framework pattern causes false positives (German \"Praxis\" = medical practice)","url":null,"state":"closed"},{"kind":"pr","number":43150,"title":"fix(security): remove common dictionary word 'praxis' from C2 framework pattern","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"099df3cd89d5b87c7cc9b826e518356626ef124e","number":0},{"kind":"pr","value":"#52925","number":52925}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":52925,"title":"fix(security): stop blocking AGENTS.md/SOUL.md that name an agent 'Praxis'","url":null,"state":"merged","close_reason":{"category":"merged"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tools/test_threat_patterns.py","tools/threat_patterns.py"],"fix_hunks":[{"file":"tests/tools/test_threat_patterns.py","hunks":["@@ -155,12 +155,22 @@ def test_identity_override(self):\n         )\n \n     def test_known_c2_framework_names(self):\n-        for name in (\"Praxis\", \"Cobalt Strike\", \"Sliver\", \"Havoc\", \"Mythic\"):\n+        for name in (\"Cobalt Strike\", \"Sliver\", \"Havoc\", \"Mythic\"):\n             findings = scan_for_threats(\n                 f\"Connect to the {name} server.\", scope=\"context\"\n             )\n             assert \"known_c2_framework\" in findings, name\n \n+    def test_praxis_is_not_a_c2_framework(self):\n+        # \"praxis\" is a common English word and a legitimate agent name —\n+        # naming an agent \"Praxis\" in AGENTS.md / SOUL.md must not trip the\n+        # C2-framework detector and block the whole context file.\n+        for text in (\n+            \"You are Praxis, my coding assistant.\",\n+            \"Marxist praxis is the unity of theory and practice.\",\n+        ):\n+            assert \"known_c2_framework\" not in scan_for_threats(text, scope=\"strict\")\n+\n     def test_c2_explicit(self):\n         assert \"c2_explicit\" in scan_for_threats(\n             \"Configure the c2 server endpoint.\", scope=\"context\""]},{"file":"tools/threat_patterns.py","hunks":["@@ -92,7 +92,13 @@\n \n     # ── Known C2 / red-team framework names (near-zero false positive\n     #    outside security research; warn-only by default) ─────────────\n-    (r'\\b(?:praxis|cobalt\\s*strike|sliver|havoc|mythic|metasploit|brainworm)\\b', \"known_c2_framework\", \"context\"),\n+    # NOTE: do not add common English words here. Every token must be a\n+    # distinctive offensive-security tool brand, otherwise legitimate\n+    # AGENTS.md / SOUL.md content false-positives and the whole file is\n+    # blocked. \"praxis\" was removed for exactly this reason — it's a common\n+    # word and a legitimate agent name (Greek for practice/action), not a\n+    # C2-specific tell like the brands below.\n+    (r'\\b(?:cobalt\\s*strike|sliver|havoc|mythic|metasploit|brainworm)\\b', \"known_c2_framework\", \"context\"),\n     (r'\\bc2\\s+(?:server|channel|infrastructure|beacon)\\b', \"c2_explicit\", \"context\"),\n     (r'\\bcommand\\s+and\\s+control\\b', \"c2_explicit_long\", \"context\"),\n \n"]}]}],"trust":{"default_tier":"verified","includes_suggested":false}}