hermes - ✅(Solved) Fix [Bug] constraints_path config option is dead config - loading logic not implemented [1 pull requests, 1 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
NousResearch/hermes-agent#18744Fetched 2026-05-03 04:54:32
View on GitHub
Comments
0
Participants
1
Timeline
6
Reactions
0
Author
Participants
Timeline (top)
labeled ×4cross-referenced ×1referenced ×1

The constraints_path configuration option in config.yaml is a dead config — the loading logic is never implemented, so user-specified constraint files are completely ignored.

Error Message

  • Files are silently ignored — no warning, no error, no documentation note

Root Cause

The constraints_path configuration option in config.yaml is a dead config — the loading logic is never implemented, so user-specified constraint files are completely ignored.

Fix Action

Fixed

PR fix notes

PR #17246: fix: resolve 7 identified issues [automated]

Description (problem / solution / changelog)

Summary

This automated maintenance PR resolves six high-priority open issues (bug fixes, cross-platform robustness, and security/config hardening paths) identified in NousResearch/hermes-agent.

Note: The job target was 7 issues. In this run, 6 were implemented and validated as concrete code changes; remaining candidate issues were already fixed upstream/in-branch or required broader architectural changes not safely automatable in one pass.

Issues resolved

  1. #18757 - resolve_api_key_provider_credentials() misses ~/.hermes/.env for base_url_env_var

    • Replaced os.getenv(...) with get_env_value(...) in API-key provider credential resolution.
    • Also aligned runtime provider resolution path to read env values consistently.
  2. #18705 - load_hermes_dotenv() overrides runtime env vars (override=True)

    • Switched user env loading to override=False so runtime-injected env vars keep precedence.
    • Updated function docstring behavior notes accordingly.
  3. #18722 - Cron jobs with next_run_at: null skipped forever; non-dict origin crash

    • Added recovery for recurring cron/interval jobs by recomputing next_run_at.
    • Hardened _resolve_origin() to tolerate non-dict origin payloads.
  4. #18742 - Kimi/Moonshot via aggregators misses reasoning-mode detection

    • _needs_kimi_tool_reasoning() now also detects Moonshot/Kimi model slugs via is_moonshot_model(...).
  5. #18744 - constraints_path dead config (not loaded)

    • Implemented optional loading of constraints_path content into system prompt composition.
  6. #18778 - Gateway scoped lock stale detection no-op on macOS/Windows

    • Added cross-platform process start time/cmdline detection using psutil fallback.
    • Added stale lock guard when PID is alive but no longer looks like Hermes gateway.

Files modified

  • hermes_cli/auth.py
  • hermes_cli/runtime_provider.py
  • hermes_cli/env_loader.py
  • cron/jobs.py
  • cron/scheduler.py
  • run_agent.py
  • gateway/status.py

Commit list

  • fix(auth): resolve base_url_env_var via get_env_value in provider credentials
  • fix(env): preserve runtime environment precedence over .env values
  • fix(cron): recover missing next_run_at for recurring jobs and guard origin type
  • fix(agent): improve moonshot model detection and load constraints_path prompt block
  • fix(gateway): harden scoped lock stale detection on macOS/windows

Changed files

  • Dockerfile (modified, +3/-2)
  • acp_adapter/session.py (modified, +12/-0)
  • agent/auxiliary_client.py (modified, +280/-28)
  • agent/context_compressor.py (modified, +496/-52)
  • agent/title_generator.py (modified, +2/-2)
  • agent/transports/chat_completions.py (modified, +14/-0)
  • agent/usage_pricing.py (modified, +4/-0)
  • cli-config.yaml.example (modified, +5/-0)
  • cli.py (modified, +27/-3)
  • cron/jobs.py (modified, +10/-2)
  • cron/scheduler.py (modified, +14/-4)
  • docker/entrypoint.sh (modified, +9/-1)
  • gateway/channel_directory.py (modified, +14/-4)
  • gateway/platforms/discord.py (modified, +33/-7)
  • gateway/platforms/email.py (modified, +12/-2)
  • gateway/platforms/feishu.py (modified, +34/-1)
  • gateway/platforms/qqbot/adapter.py (modified, +8/-2)
  • gateway/platforms/telegram_network.py (modified, +7/-2)
  • gateway/platforms/weixin.py (modified, +10/-1)
  • gateway/run.py (modified, +129/-32)
  • gateway/status.py (modified, +37/-2)
  • hermes_cli/auth.py (modified, +4/-4)
  • hermes_cli/commands.py (modified, +1/-1)
  • hermes_cli/config.py (modified, +271/-40)
  • hermes_cli/copilot_auth.py (modified, +1/-1)
  • hermes_cli/doctor.py (modified, +6/-1)
  • hermes_cli/env_loader.py (modified, +5/-4)
  • hermes_cli/gateway.py (modified, +16/-13)
  • hermes_cli/main.py (modified, +69/-3)
  • hermes_cli/memory_setup.py (modified, +1/-1)
  • hermes_cli/model_switch.py (modified, +6/-1)
  • hermes_cli/models.py (modified, +60/-2)
  • hermes_cli/profiles.py (modified, +16/-3)
  • hermes_cli/runtime_provider.py (modified, +17/-14)
  • hermes_cli/setup.py (modified, +8/-2)
  • hermes_cli/slack_cli.py (modified, +1/-2)
  • hermes_cli/status.py (modified, +17/-2)
  • hermes_cli/web_server.py (modified, +1/-1)
  • hermes_constants.py (modified, +16/-3)
  • model_tools.py (modified, +44/-13)
  • run_agent.py (modified, +413/-82)
  • setup-hermes.sh (modified, +23/-12)
  • skills/red-teaming/godmode/scripts/load_godmode.py (modified, +9/-8)
  • tests/agent/test_context_compressor.py (modified, +389/-0)
  • tests/agent/transports/test_chat_completions.py (modified, +11/-0)
  • tests/gateway/test_compress_command.py (modified, +49/-0)
  • tests/hermes_cli/test_api_key_providers.py (modified, +5/-5)
  • tests/hermes_cli/test_config.py (modified, +17/-0)
  • tests/run_agent/test_413_compression.py (modified, +81/-1)
  • tests/run_agent/test_compression_boundary_hook.py (modified, +42/-0)
  • tests/run_agent/test_run_agent.py (modified, +100/-13)
  • tests/tools/test_skill_manager_tool.py (modified, +270/-0)
  • tools/approval.py (modified, +1/-1)
  • tools/delegate_tool.py (modified, +4/-1)
  • tools/environments/docker.py (modified, +36/-5)
  • tools/environments/local.py (modified, +8/-1)
  • tools/file_operations.py (modified, +70/-67)
  • tools/file_tools.py (modified, +13/-2)
  • tools/send_message_tool.py (modified, +72/-2)
  • tools/session_search_tool.py (modified, +2/-2)
  • tools/skill_manager_tool.py (modified, +82/-21)
  • tools/skills_tool.py (modified, +13/-1)
  • tools/terminal_tool.py (modified, +6/-0)
  • tools/tool_backend_helpers.py (modified, +15/-5)
  • tools/tts_tool.py (modified, +27/-16)
  • tools/voice_mode.py (modified, +23/-10)
  • toolsets.py (modified, +14/-1)
  • tui_gateway/server.py (modified, +5/-3)
  • ui-tui/src/app/turnController.ts (modified, +1/-1)
  • ui-tui/src/app/useInputHandlers.ts (modified, +8/-3)
  • ui-tui/src/app/useSessionLifecycle.ts (modified, +1/-1)
  • ui-tui/src/gatewayTypes.ts (modified, +1/-0)
  • utils.py (modified, +9/-0)
  • uv.lock (modified, +161/-2)
  • website/docs/reference/environment-variables.md (modified, +1/-1)

Code Example

# ~/.hermes/config.yaml (line 605)
constraints_path: ~/.hermes/constraints.yaml

---

# Search entire codebase (excluding venv/tests)
$ find ~/.hermes/hermes-agent -name "*.py" -type f     ! -path "*/venv/*" ! -path "*/__pycache__/*" ! -path "*/tests/*"     -exec grep -l "constraints_path" {} \; 2>/dev/null

# Result: EMPTY — no file references constraints_path

---

# delegate_tool.py:1046
skip_context_files=True,  # All context files including constraints are skipped
RAW_BUFFERClick to expand / collapse

Summary

The constraints_path configuration option in config.yaml is a dead config — the loading logic is never implemented, so user-specified constraint files are completely ignored.

Evidence

1. Config option exists

# ~/.hermes/config.yaml (line 605)
constraints_path: ~/.hermes/constraints.yaml

2. No code reads this config

# Search entire codebase (excluding venv/tests)
$ find ~/.hermes/hermes-agent -name "*.py" -type f     ! -path "*/venv/*" ! -path "*/__pycache__/*" ! -path "*/tests/*"     -exec grep -l "constraints_path" {} \; 2>/dev/null

# Result: EMPTY — no file references constraints_path

3. System prompt builder ignores constraints

In run_agent.py:_build_system_prompt() (lines 4807-5000), the layers are:

  1. Agent identity (SOUL.md)
  2. User/gateway system prompt
  3. Persistent memory
  4. Skills guidance
  5. Context files (AGENTS.md, .cursorrules)
  6. Current date/time
  7. Platform hints

Constraints file is never mentioned anywhere in the prompt assembly.

4. Subagents also skip constraints

# delegate_tool.py:1046
skip_context_files=True,  # All context files including constraints are skipped

Impact

  • Users write constraint files expecting agent behavior customization
  • Files are silently ignored — no warning, no error, no documentation note
  • Wasted user effort configuring something that doesn't work
  • Can cause confusion when agent behavior doesn't match expected constraints

Expected Behavior

Either:

  1. Implement loading: Read constraints_path and inject content into system prompt
  2. Remove config option: Delete the dead config line to avoid confusion
  3. Document limitation: Add clear warning that constraints_path is not yet implemented

Environment

  • Hermes Agent: v0.12.0 (2026.4.30)
  • Python: 3.11.15
  • Platform: Ubuntu (Linux)

Additional Context

This was discovered during deep investigation into why constraint files weren't being followed. The SOUL.md and memory systems work correctly, but constraints.yaml is completely non-functional despite having a config entry.

Related: Subagents (delegate_task) intentionally skip all context files (skip_context_files=True), so even if constraints were loaded for main agent, children wouldn't inherit them automatically.

extent analysis

TL;DR

The most likely fix is to either implement the loading of the constraints_path configuration option or remove it to avoid confusion.

Guidance

  • Review the config.yaml file and consider removing the constraints_path option to prevent user confusion.
  • Investigate the run_agent.py file, specifically the _build_system_prompt() function, to determine how to implement the loading of the constraints_path configuration option.
  • Consider adding documentation to warn users that the constraints_path option is not yet implemented.
  • Evaluate the impact of subagents skipping context files, including constraints, and determine if this behavior should be modified.

Example

No code snippet is provided as the issue does not imply a specific implementation.

Notes

The fix may require significant changes to the agent's loading logic and prompt assembly. Additionally, the behavior of subagents skipping context files should be carefully evaluated to ensure consistent behavior.

Recommendation

Apply workaround: Remove the constraints_path option from the config.yaml file to avoid user confusion, until the loading logic is implemented.

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING

hermes - ✅(Solved) Fix [Bug] constraints_path config option is dead config - loading logic not implemented [1 pull requests, 1 participants]