hermes - 💡(How to fix) Fix SOUL.md/personality not reflected in hermes -z oneshot identity [1 pull requests]

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…

SOUL.md is present and agent.prompt_builder.load_soul_md() loads it correctly from HERMES_HOME, but hermes -z still answers from the baked-in/default Hermes identity instead of the configured SOUL/personality identity.

This makes hermes -z misleading as a smoke test for persona/SOUL changes. It may also indicate that oneshot is not exercising the same prompt assembly path as normal gateway/chat turns, despite oneshot.py saying rules/memory/AGENTS.md/preloaded skills are the same as a normal chat turn.

Root Cause

SOUL.md is present and agent.prompt_builder.load_soul_md() loads it correctly from HERMES_HOME, but hermes -z still answers from the baked-in/default Hermes identity instead of the configured SOUL/personality identity.

This makes hermes -z misleading as a smoke test for persona/SOUL changes. It may also indicate that oneshot is not exercising the same prompt assembly path as normal gateway/chat turns, despite oneshot.py saying rules/memory/AGENTS.md/preloaded skills are the same as a normal chat turn.

Fix Action

Fixed

Code Example

# Alt Brian Persona

You are Alt Brian, also known as Alternative Brian: an alternative personality of Brian and a senior-level systems architect and full-stack engineer.

Hermes Agent is the underlying platform. Your conversational identity is Alt Brian.

---

docker exec -w /opt/data -e HERMES_HOME=/opt/data Hermes-Agent \
  /opt/hermes/.venv/bin/python -c 'from agent.prompt_builder import load_soul_md; c=load_soul_md() or ""; print("loaded_chars", len(c)); print("You are Alt Brian", "YES" if "You are Alt Brian" in c else "NO")'

---

loaded_chars 3581
You are Alt Brian YES

---

docker exec -w /opt/data -e HERMES_HOME=/opt/data Hermes-Agent \
  /opt/hermes/.venv/bin/hermes config show

---

Display
  Personality:  alt-brian

Messaging Platforms
  Discord:      configured

---

docker exec -w /opt/data -e HERMES_HOME=/opt/data Hermes-Agent \
  /opt/hermes/.venv/bin/hermes -z "What is your name? Answer in one short sentence."

---

I am Hermes, your digital assistant. How can I assist you today?
RAW_BUFFERClick to expand / collapse

Summary

SOUL.md is present and agent.prompt_builder.load_soul_md() loads it correctly from HERMES_HOME, but hermes -z still answers from the baked-in/default Hermes identity instead of the configured SOUL/personality identity.

This makes hermes -z misleading as a smoke test for persona/SOUL changes. It may also indicate that oneshot is not exercising the same prompt assembly path as normal gateway/chat turns, despite oneshot.py saying rules/memory/AGENTS.md/preloaded skills are the same as a normal chat turn.

Environment

  • Hermes Agent: v0.15.1 (2026.5.29)
  • Docker image: nousresearch/hermes-agent:latest
  • Image ID: sha256:7f36bf7ea964894862473700e5ce15aafbd5e6c6de0972db5d8d4776d0af658d
  • Repo digest: nousresearch/hermes-agent@sha256:8c40a546088224d5213e074713d9818335e20af16a69a2d8be2d7958cbe7f147
  • Image created: 2026-05-29T17:03:01.267699006Z
  • Python: 3.13.5
  • OpenAI SDK: 2.24.0
  • HERMES_HOME=/opt/data
  • Model/provider:
    • model: qwen2.5:3b
    • provider: custom
    • base_url: http://host.docker.internal:11434/v1
  • display.personality: alt-brian
  • Discord gateway is configured and running.

Repro

Create/update /opt/data/SOUL.md:

# Alt Brian Persona

You are Alt Brian, also known as Alternative Brian: an alternative personality of Brian and a senior-level systems architect and full-stack engineer.

Hermes Agent is the underlying platform. Your conversational identity is Alt Brian.

Confirm Hermes can load the SOUL file:

docker exec -w /opt/data -e HERMES_HOME=/opt/data Hermes-Agent \
  /opt/hermes/.venv/bin/python -c 'from agent.prompt_builder import load_soul_md; c=load_soul_md() or ""; print("loaded_chars", len(c)); print("You are Alt Brian", "YES" if "You are Alt Brian" in c else "NO")'

Observed:

loaded_chars 3581
You are Alt Brian YES

Confirm config has the active personality:

docker exec -w /opt/data -e HERMES_HOME=/opt/data Hermes-Agent \
  /opt/hermes/.venv/bin/hermes config show

Relevant output:

◆ Display
  Personality:  alt-brian

◆ Messaging Platforms
  Discord:      configured

Now test oneshot:

docker exec -w /opt/data -e HERMES_HOME=/opt/data Hermes-Agent \
  /opt/hermes/.venv/bin/hermes -z "What is your name? Answer in one short sentence."

Observed:

I am Hermes, your digital assistant. How can I assist you today?

Expected Behavior

If hermes -z is intended to run a normal agent turn with normal rules/context, it should use the configured SOUL/personality identity and answer as Alt Brian.

At minimum, documentation/help text should clearly state that hermes -z bypasses SOUL/personality if that is intended behavior.

Actual Behavior

  • load_soul_md() loads the configured /opt/data/SOUL.md.
  • config show shows active personality alt-brian.
  • hermes -z still answers as Hermes/default identity.

Source Pointers

From local source inspection:

  • agent/system_prompt.py attempts to use load_soul_md() as the primary identity slot unless context files are skipped.
  • agent/prompt_builder.py loads SOUL.md from get_hermes_home() / "SOUL.md".
  • hermes_cli/oneshot.py says: Rules / memory / AGENTS.md / preloaded skills = same as a normal chat turn.

So either:

  1. hermes -z is unintentionally bypassing/overriding the SOUL identity layer, or
  2. hermes -z intentionally bypasses it but the docs/comments/help text make that unclear.

Possible Fix Direction

If oneshot is intended to behave like a normal agent turn:

  • Ensure run_oneshot() / _run_agent() constructs AIAgent with skip_context_files=False unless --ignore-rules is set.
  • Ensure HERMES_HOME/profile resolution is identical to gateway/chat mode.
  • Add a regression test:
    • create temp HERMES_HOME
    • write a distinct SOUL.md
    • run oneshot or prompt builder path
    • assert the system prompt/final behavior includes the SOUL identity

If oneshot is intended to be a raw/base model shortcut:

  • Update docs/help/comment in oneshot.py to say it does not apply SOUL/personality.

Related

This looks related in spirit to the earlier SOUL/context mismatch class of bugs, such as:

That issue is cron-specific and closed, but the pattern is similar: a non-primary execution path not reflecting the expected SOUL identity.

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 - 💡(How to fix) Fix SOUL.md/personality not reflected in hermes -z oneshot identity [1 pull requests]