{"repo":"NousResearch/hermes-agent","public_id":"67397","display_label":"Doctor falsely flags valid config keys as unknown","summary":"A bug where `hermes doctor` incorrectly warns that supported top-level config keys like `group_sessions_per_user` and `known_plugin_toolsets` are unknown or ignored. Multiple fix attempts address adding these keys to an allowlist (`_EXTRA_KNOWN_ROOT_KEYS`) to suppress the false warnings.","subsystem":"hermes_cli","counts":{"members":11,"open_issues":0,"open_issues_distinct":0,"open_prs":0,"closed_issues":4,"merged_prs":1,"attempt_prs":6},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":67891},"resolution":{"state":"partially_resolved","by":"pr-67891"},"freshness":{"state":"verified","last_verified_at":"2026-07-20T06:23:11+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.16654545454545455},"fix_edges":[{"issue_number":67397,"pr_number":67891,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true}],"members":[{"kind":"issue","number":67397,"title":"[Bug]: `hermes doctor` flags supported top-level config keys `group_sessions_per_user` and `known_plugin_toolsets` as unknown","url":null,"state":"closed"},{"kind":"issue","number":67478,"title":"[Bug] follow-up #67397: _EXTRA_KNOWN_ROOT_KEYS still missing group_sessions_per_user + known_plugin_toolsets on main","url":null,"state":"closed"},{"kind":"issue","number":67860,"title":"[Bug]: ⚠ Config issues detected in config.yaml:","url":null,"state":"closed"},{"kind":"issue","number":68000,"title":"Doctor reports runtime-supported root config keys as ignored","url":null,"state":"closed"},{"kind":"pr","number":67497,"title":"fix(config): add group_sessions_per_user + known_plugin_toolsets to _EXTRA_KNOWN_ROOT_KEYS (#67478)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#67924","number":67924}],"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":67513,"title":"fix(config): add group_sessions_per_user and known_plugin_toolsets to _EXTRA_KNOWN_ROOT_KEYS","url":null,"state":"closed","close_reason":{"category":"implemented_elsewhere","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":67517,"title":"fix(config): 添加 group_sessions_per_user 和 known_plugin_toolsets 到白名单","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#67497","number":67497},{"kind":"pr","value":"#67447","number":67447}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":67583,"title":"fix(cli): recognize group_sessions_per_user and known_plugin_toolsets as known config roots (#67478)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#67497","number":67497},{"kind":"pr","value":"#67447","number":67447}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":67654,"title":"fix(config,doctor): accept known roots and synthetic slugs","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#67924","number":67924}],"category":"wontfix_bydesign","implication":"wontfix"},"merged":false},{"kind":"pr","number":67891,"title":"fix(config): stop doctor flagging all Hermes-written top-level config keys","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/config.py","tests/hermes_cli/test_config_validation.py"],"fix_hunks":[{"file":"hermes_cli/config.py","hunks":["@@ -5512,7 +5512,14 @@ def check_config_version() -> Tuple[int, int]:\n     \"plugins\",           # plugin enable/disable lists (hermes_cli/plugins_cmd.py)\n     \"smart_model_routing\",   # written by the setup wizard (hermes_cli/setup.py)\n     \"platform_toolsets\",     # written by the setup wizard (hermes_cli/setup.py)\n+    \"known_plugin_toolsets\", # written/read by hermes_cli/tools_config.py toolset-save flow\n     \"session_reset\",         # top-level form read by gateway/config.py + setup\n+    \"group_sessions_per_user\",   # top-level form bridged by gateway/config.py\n+    \"thread_sessions_per_user\",  # top-level form bridged by gateway/config.py\n+    \"stt_echo_transcripts\",      # top-level form bridged by gateway/config.py\n+    \"reset_triggers\",            # top-level form bridged by gateway/config.py\n+    \"always_log_local\",          # top-level form bridged by gateway/config.py\n+    \"filter_silence_narration\",  # top-level form bridged by gateway/config.py\n     \"multiplex_profiles\",    # top-level form accepted alongside gateway.multiplex_profiles\n     \"profile_routes\",        # top-level form accepted alongside gateway.profile_routes\n     \"platforms\",             # top-level per-platform map merged by gateway/config.py"]},{"file":"tests/hermes_cli/test_config_validation.py","hunks":["@@ -253,6 +253,28 @@ def test_known_root_keys_derived_from_default_config(self):\n         assert _EXTRA_KNOWN_ROOT_KEYS.issubset(_KNOWN_ROOT_KEYS)\n         assert _KNOWN_ROOT_KEYS == frozenset(DEFAULT_CONFIG.keys()) | _EXTRA_KNOWN_ROOT_KEYS\n \n+    def test_hermes_written_roots_not_flagged_as_unknown(self):\n+        \"\"\"Roots Hermes itself writes/reads must not warn as unknown (#67397).\"\"\"\n+        issues = validate_config_structure({\n+            \"model\": {\"provider\": \"openrouter\"},\n+            \"known_plugin_toolsets\": {\"cli\": [\"spotify\"]},\n+            \"group_sessions_per_user\": True,\n+            \"thread_sessions_per_user\": False,\n+            \"stt_echo_transcripts\": True,\n+            \"reset_triggers\": [\"/new\"],\n+            \"always_log_local\": True,\n+            \"filter_silence_narration\": True,\n+        })\n+        unknown = [i for i in issues if \"Unknown top-level config key\" in i.message]\n+        messages = \" \".join(i.message for i in unknown)\n+        assert \"known_plugin_toolsets\" not in messages\n+        assert \"group_sessions_per_user\" not in messages\n+        assert \"thread_sessions_per_user\" not in messages\n+        assert \"stt_echo_transcripts\" not in messages\n+        assert \"reset_triggers\" not in messages\n+        assert \"always_log_local\" not in messages\n+        assert \"filter_silence_narration\" not in messages\n+\n     def test_provider_like_unknown_root_keeps_misplaced_message(self):\n         \"\"\"Preserve existing base_url/api_key root-level guidance (not generic unknown).\"\"\"\n         issues = validate_config_structure({\n"]}]},{"kind":"pr","number":68023,"title":"fix(config): add runtime-supported keys to _EXTRA_KNOWN_ROOT_KEYS (#68000)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"9bda6438d41","number":0},{"kind":"pr","value":"#67924","number":67924},{"kind":"pr","value":"#68000","number":68000}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}