{"repo":"NousResearch/hermes-agent","public_id":"9240","display_label":"Config precedence and stale env override bugs","summary":"These issues and fixes address conflicts between config.yaml settings and .env values, where stale environment variables incorrectly override intended configuration. A related cluster covers Docker-specific JSON being parsed regardless of the active terminal backend, causing crashes on non-Docker setups.","subsystem":"environments","counts":{"members":28,"open_issues":3,"open_issues_distinct":3,"open_prs":4,"closed_issues":5,"merged_prs":4,"attempt_prs":16},"landed_fix":{"status":"merged_to_main","basis":"structural","pr":21240},"resolution":{"state":"partially_resolved","by":"pr-21240,pr-42733,pr-77180"},"freshness":{"state":"verified","last_verified_at":"2026-08-03T01:21:59+00:00","is_stale":false},"grouping":{"backbone":"STRUCTURAL_PARTIAL","link_density":0.060529100529100516},"fix_edges":[{"issue_number":19158,"pr_number":21240,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":29186,"pr_number":77180,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":42725,"pr_number":42733,"tier":"verified","basis":"closing_ref","confidence":0.95,"recoverable_from_timeline":true},{"issue_number":71137,"pr_number":77180,"tier":"verified","basis":"superseded_ref","confidence":0.9,"recoverable_from_timeline":false}],"members":[{"kind":"issue","number":9240,"title":"Bug: Discord free_response_channels from config.yaml can become operationally unreliable after restart; explicit .env fixes it","url":null,"state":"closed"},{"kind":"issue","number":13582,"title":"Non-secret gateway settings in .env silently override config.yaml","url":null,"state":"open"},{"kind":"issue","number":13685,"title":"[Bug]: config.yaml settings override .env settings, despite doc says the opposite","url":null,"state":"open"},{"kind":"issue","number":17534,"title":"[Bug]: setup wizard double-writes max_turns to both .env (HERMES_MAX_ITERATIONS) and config.yaml (agent.max_turns), causing silent state drift","url":null,"state":"closed"},{"kind":"issue","number":19158,"title":"Gateway max_turns can be overridden by stale HERMES_MAX_ITERATIONS from .env","url":null,"state":"closed"},{"kind":"issue","number":25402,"title":"terminal.backend=local can still use Docker when stale Docker config keys remain","url":null,"state":"open"},{"kind":"issue","number":29186,"title":"TERMINAL_ENV in ~/.hermes/.env overrides terminal.backend in config.yaml","url":null,"state":"closed"},{"kind":"issue","number":42725,"title":"[Bug]: TERMINAL_DOCKER_VOLUMES parsed eagerly with json.loads regardless of terminal.backend, crashes all subprocess tools","url":null,"state":"closed"},{"kind":"pr","number":13629,"title":"fix(gateway-config): warn when non-secret settings conflict between config.yaml and .env (#13582)","url":null,"state":"closed","close_reason":{"category":"stale_abandoned","implication":"active"},"merged":false},{"kind":"pr","number":13732,"title":"fix(discord): honor documented env-wins-over-config precedence for require_mention/free_response_channels","url":null,"state":"closed","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":17554,"title":"fix(setup): keep max turns in config","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#17672","number":17672},{"kind":"pr","value":"#17534","number":17534}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":17672,"title":"fix(cli): drop max_turns env-var dual-write in setup wizard (#17534)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#18413","number":18413},{"kind":"pr","value":"#18413","number":18413}],"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":18764,"title":"fix(gateway): config.yaml wins over .env for agent/display/timezone settings","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":19183,"title":"fix(gateway): preserve max turns after env reload","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#18230","number":18230},{"kind":"pr","value":"#17306","number":17306}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":21240,"title":"fix(gateway): preserve max_turns after env reload (salvage #19183)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["gateway/run.py","tests/gateway/test_runtime_env_reload_config_authority.py"]},{"kind":"pr","number":25881,"title":"fix(terminal): clear container config when backend is local","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#25402","number":25402},{"kind":"pr","value":"#25412","number":25412},{"kind":"pr","value":"#23321","number":23321}],"category":"wontfix_bydesign","implication":"wontfix"},"merged":false},{"kind":"pr","number":26546,"title":"fix(gateway): ignore stale docker config for local terminal","url":null,"state":"closed","close_reason":{"refs":[{"kind":"commit","value":"29036155ceb9e29d07f7b49eb073e6ec23802bf8","number":0},{"kind":"pr","value":"#25402","number":25402}],"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":29239,"title":"fix(env): make config.yaml authoritative for terminal.backend (#29186)","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":29246,"title":"docs(skills): require duplicate search before filing GitHub issues","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false},{"kind":"pr","number":29372,"title":"fix: always export TERMINAL_ENV from config.yaml to prevent stale .env override","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#29239","number":29239}],"category":"superseded_by_pr","implication":"superseded"},"merged":false,"is_fix_pr":true,"fix_tier":"suggested","fix_detail_withheld":true},{"kind":"pr","number":39641,"title":"fix(config): warn when env shadows gateway config (#13582)","url":null,"state":"open","close_reason":{"category":"implemented_elsewhere","implication":"superseded"},"merged":false},{"kind":"pr","number":42733,"title":"fix(terminal): lazy-parse Docker env config","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["tests/tools/test_terminal_tool.py","tools/terminal_tool.py"]},{"kind":"pr","number":42736,"title":"fix(terminal): ignore malformed docker JSON outside docker backend","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#42733","number":42733},{"kind":"pr","value":"#42725","number":42725}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":42791,"title":"fix(terminal): use safe JSON parser for docker env vars (#42725)","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#42733","number":42733},{"kind":"pr","value":"#42725","number":42725},{"kind":"pr","value":"#42733","number":42733}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":42910,"title":"fix(terminal): ignore docker config JSON on local backend","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#42733","number":42733}],"category":"superseded_by_pr","implication":"superseded"},"merged":false},{"kind":"pr","number":42911,"title":"fix(terminal): guard Docker env var parsing against non-Docker backends","url":null,"state":"closed","close_reason":{"refs":[{"kind":"pr","value":"#42733","number":42733}],"category":"duplicate_of","implication":"duplicate"},"merged":false},{"kind":"pr","number":77180,"title":"fix(env): config.yaml terminal.* keys win over stale .env on every reload (#29186)","url":null,"state":"merged","close_reason":{"category":"merged","implication":"superseded"},"merged":true,"is_fix_pr":true,"fix_tier":"verified","files_changed":["hermes_cli/env_loader.py","tests/gateway/test_runtime_env_reload_config_authority.py","tests/hermes_cli/test_dump_terminal_backend.py","tests/hermes_cli/test_env_loader.py"]},{"kind":"pr","number":89451,"title":"fix(discord): explicit DISCORD_FREE_RESPONSE_CHANNELS beats config.yaml","url":null,"state":"open","close_reason":{"category":"uncategorized","implication":"needs_llm"},"merged":false}],"trust":{"default_tier":"verified","includes_suggested":false}}