[GH-ISSUE #1521] [Bug] Setup ignores the sticky Hermes profile and writes the default one #518

Closed
opened 2026-10-15 18:25:47 +00:00 by bsakaguchi · 0 comments
Owner

Originally created by @CassieFox23 on GitHub (Oct 10, 2026).
Original GitHub issue: https://github.com/morluto/rea/issues/1521

TL;DR: Setup writes the default Hermes home, even when Hermes has a sticky profile, and doctor says aligned. Hermes Agent (MIT) would then run in the other profile, where REA is missing. Found while testing #1403 after it merged.

Before submitting

  • I searched the open and closed issues for a related report.
  • I removed credentials, tokens, private paths, and sensitive target data.

Area

Setup, packaging, or upgrade

Observed behavior

I made a fake home with coder in ~/.hermes/active_profile. The profile had its own ~/.hermes/profiles/coder/config.yaml. HERMES_HOME was unset.

Setup planned and wrote two paths, both in the default profile:

  • ~/.hermes/config.yaml (created)
  • ~/.hermes/skills/reverse-engineer-anything

The coder config kept the same checksum. Doctor gave "state":"aligned" for hermes at ~/.hermes/config.yaml.

REA never reads active_profile. A search of src, docs and tests on main finds no match. The path code is hermesDirectory in src/application/SupportedClients.ts, lines 124 to 160. It checks HERMES_HOME, then HERMES_DATA_DIR_SUFFIX, then ~/.hermes.

docs/installation.md, lines 210 to 214, says the skill goes under "the active Hermes home's skills directory". In practice, "active" only means what the environment says.

Reproduction

Use a throwaway home. Do not run this against a real one.

  1. Make the fake home and the sticky profile.

    export HOME="$(mktemp -d)"
    unset HERMES_HOME HERMES_DATA_DIR_SUFFIX
    mkdir -p "$HOME/.hermes/profiles/coder"
    printf 'coder\n' > "$HOME/.hermes/active_profile"
    printf 'model:\n  default: local-model\n' > "$HOME/.hermes/profiles/coder/config.yaml"
    
  2. Run rea setup --client hermes --yes --format json.

  3. Run rea doctor --client hermes --skill --format json.

  4. Compare ~/.hermes/config.yaml with ~/.hermes/profiles/coder/config.yaml. Only the first has a mcp_servers.rea entry.

Expected behavior

Setup should target the profile Hermes will use. Hermes picks it like this:

  • With no -p flag, and no HERMES_HOME inside a profiles/<name> folder, it reads active_profile in the Hermes root.
  • If that name is not default, it sets HERMES_HOME to the profile folder.

REA should do the same. It could write to the sticky profile. Or it could stop with needs_human and name the profile it found. Doctor should not call the default profile aligned when Hermes runs another.

Impact and scope

Hermes profiles are separate homes. Each has its own config.yaml and its own skills. A user with a sticky profile finishes setup and sees a healthy doctor. They start hermes and find no REA tools. Nothing says why.

Not affected: users with no sticky profile. Users who set HERMES_HOME to a profile folder are fine too. So is HERMES_DATA_DIR_SUFFIX, where REA matches Hermes. No data is lost. The wrong profile gets a new entry and a skill copy.

Setup is not unsafe here. It aims at the wrong place, and doctor agrees with it.

Interface

Package or setup

Earliest failure stage

Setup or provider admission

Not run

Edit: the HERMES_HOME case ran, in the #1528 check. Still not run: Hermes Agent itself and Windows.

  • I did not run Hermes Agent. Its side comes from its docs and source, read on GitHub at commit dce1e9b37581dd62e480a9064dc04a709c2940d3. The LICENSE there is MIT.
  • Windows was not run.
  • A sticky profile with HERMES_HOME set to the Hermes root was not run. Fixed by #1528.
Hermes docs and source lines

Hermes docs, website/docs/user-guide/profiles.md:

  • Line 11: "A profile is a separate Hermes home directory." Each one has "its own config.yaml" and its own skills.
  • Lines 203 to 212: the heading "Sticky default (hermes profile use)". The example runs hermes profile use coder, then hermes chat with the comment "now targets coder". Line 212 says "Sets a default so plain hermes commands target that profile."

Hermes source, hermes_cli/main.py, function _apply_profile_override:

  • Lines 602 to 609: a comment says that if HERMES_HOME points at the Hermes root, "we must still read active_profile".
  • Lines 614 to 622: it reads get_default_hermes_root() / "active_profile". A name other than default becomes the profile.
  • Line 657: os.environ["HERMES_HOME"] = hermes_home.

Hermes source, hermes_constants.py, lines 98 to 104: Hermes warns when HERMES_HOME is unset and a profile is sticky. The text says the fallback "is the DEFAULT profile". It adds that data written there will "land in the wrong profile". That is Hermes naming this same mistake.

REA, main 7a56fe626:

  • src/application/SupportedClients.ts, lines 513 to 520, build the Hermes paths from hermesDirectory(context).
  • #1504 does not change this. Every Hermes match in its diff is an unchanged context line. Between 983b070d4 and main, SupportedClients.ts has no Hermes change.
Key output from the run

Doctor on main 7a56fe626, shortened. 983b070d4 and the #1504 head b7f544005 gave the same:

"registrations":[{"client":"hermes","config_path":"<HOME>/.hermes/config.yaml","state":"aligned","remediation":null}]

The coder config had the same checksum before and after setup. Setup changed ~/.hermes/config.yaml and the files under ~/.hermes/skills/reverse-engineer-anything.

Test setup
  • Box: Nobara 44 (Fedora 44 base), Linux 7.2.9
  • CPU: AMD Ryzen 9 5900X, 12 cores / 24 threads
  • RAM: 32 GB DDR4-3600
  • Node: 24.18.0
  • REA version: main 7a56fe626, which holds #1504; also 983b070d4 and b7f544005
  • Runtime and platform: Node 24.18.0, Linux x64, fake home, clean environment
  • Other: Hermes Agent (MIT) docs and source at dce1e9b, read only

🤖 Generated with Claude Code (Opus 5.5) 🦊

Originally created by @CassieFox23 on GitHub (Oct 10, 2026). Original GitHub issue: https://github.com/morluto/rea/issues/1521 **TL;DR:** Setup writes the default Hermes home, even when Hermes has a sticky profile, and doctor says aligned. [Hermes Agent](https://github.com/NousResearch/hermes-agent) ([MIT](https://github.com/NousResearch/hermes-agent/blob/main/LICENSE)) would then run in the other profile, where REA is missing. Found while testing #1403 after it merged. ### Before submitting - [x] I searched the open and closed issues for a related report. - [x] I removed credentials, tokens, private paths, and sensitive target data. ### Area Setup, packaging, or upgrade ### Observed behavior I made a fake home with `coder` in `~/.hermes/active_profile`. The profile had its own `~/.hermes/profiles/coder/config.yaml`. `HERMES_HOME` was unset. Setup planned and wrote two paths, both in the default profile: - `~/.hermes/config.yaml` (created) - `~/.hermes/skills/reverse-engineer-anything` The `coder` config kept the same checksum. Doctor gave `"state":"aligned"` for `hermes` at `~/.hermes/config.yaml`. REA never reads `active_profile`. A search of `src`, `docs` and `tests` on main finds no match. The path code is `hermesDirectory` in `src/application/SupportedClients.ts`, lines 124 to 160. It checks `HERMES_HOME`, then `HERMES_DATA_DIR_SUFFIX`, then `~/.hermes`. `docs/installation.md`, lines 210 to 214, says the skill goes under "the active Hermes home's `skills` directory". In practice, "active" only means what the environment says. ### Reproduction Use a throwaway home. Do not run this against a real one. 1. Make the fake home and the sticky profile. ```bash export HOME="$(mktemp -d)" unset HERMES_HOME HERMES_DATA_DIR_SUFFIX mkdir -p "$HOME/.hermes/profiles/coder" printf 'coder\n' > "$HOME/.hermes/active_profile" printf 'model:\n default: local-model\n' > "$HOME/.hermes/profiles/coder/config.yaml" ``` 2. Run `rea setup --client hermes --yes --format json`. 3. Run `rea doctor --client hermes --skill --format json`. 4. Compare `~/.hermes/config.yaml` with `~/.hermes/profiles/coder/config.yaml`. Only the first has a `mcp_servers.rea` entry. ### Expected behavior Setup should target the profile Hermes will use. Hermes picks it like this: - With no `-p` flag, and no `HERMES_HOME` inside a `profiles/<name>` folder, it reads `active_profile` in the Hermes root. - If that name is not `default`, it sets `HERMES_HOME` to the profile folder. REA should do the same. It could write to the sticky profile. Or it could stop with `needs_human` and name the profile it found. Doctor should not call the default profile aligned when Hermes runs another. ### Impact and scope Hermes profiles are separate homes. Each has its own `config.yaml` and its own skills. A user with a sticky profile finishes setup and sees a healthy doctor. They start `hermes` and find no REA tools. Nothing says why. Not affected: users with no sticky profile. Users who set `HERMES_HOME` to a profile folder are fine too. So is `HERMES_DATA_DIR_SUFFIX`, where REA matches Hermes. No data is lost. The wrong profile gets a new entry and a skill copy. Setup is not unsafe here. It aims at the wrong place, and doctor agrees with it. ### Interface Package or setup ### Earliest failure stage Setup or provider admission ### Not run Edit: the `HERMES_HOME` case ran, in [the #1528 check](https://github.com/morluto/rea/pull/1528#issuecomment-6099254881). Still not run: Hermes Agent itself and Windows. - I did not run Hermes Agent. Its side comes from its docs and source, read on GitHub at commit `dce1e9b37581dd62e480a9064dc04a709c2940d3`. The [`LICENSE`](https://github.com/NousResearch/hermes-agent/blob/dce1e9b37581dd62e480a9064dc04a709c2940d3/LICENSE) there is MIT. - Windows was not run. - ~~A sticky profile with `HERMES_HOME` set to the Hermes root was not run.~~ Fixed by #1528. <details> <summary>Hermes docs and source lines</summary> Hermes docs, `website/docs/user-guide/profiles.md`: - Line 11: "A profile is a separate Hermes home directory." Each one has "its own `config.yaml`" and its own skills. - Lines 203 to 212: the heading "Sticky default (`hermes profile use`)". The example runs `hermes profile use coder`, then `hermes chat` with the comment "now targets coder". Line 212 says "Sets a default so plain `hermes` commands target that profile." Hermes source, `hermes_cli/main.py`, function `_apply_profile_override`: - Lines 602 to 609: a comment says that if `HERMES_HOME` points at the Hermes root, "we must still read active_profile". - Lines 614 to 622: it reads `get_default_hermes_root() / "active_profile"`. A name other than `default` becomes the profile. - Line 657: `os.environ["HERMES_HOME"] = hermes_home`. Hermes source, `hermes_constants.py`, lines 98 to 104: Hermes warns when `HERMES_HOME` is unset and a profile is sticky. The text says the fallback "is the DEFAULT profile". It adds that data written there will "land in the wrong profile". That is Hermes naming this same mistake. REA, main `7a56fe626`: - `src/application/SupportedClients.ts`, lines 513 to 520, build the Hermes paths from `hermesDirectory(context)`. - #1504 does not change this. Every Hermes match in its diff is an unchanged context line. Between `983b070d4` and main, `SupportedClients.ts` has no Hermes change. </details> <details> <summary>Key output from the run</summary> Doctor on main `7a56fe626`, shortened. `983b070d4` and the #1504 head `b7f544005` gave the same: ```json "registrations":[{"client":"hermes","config_path":"<HOME>/.hermes/config.yaml","state":"aligned","remediation":null}] ``` The `coder` config had the same checksum before and after setup. Setup changed `~/.hermes/config.yaml` and the files under `~/.hermes/skills/reverse-engineer-anything`. </details> <details> <summary>Test setup</summary> - Box: Nobara 44 (Fedora 44 base), Linux 7.2.9 - CPU: AMD Ryzen 9 5900X, 12 cores / 24 threads - RAM: 32 GB DDR4-3600 - Node: 24.18.0 - REA version: main `7a56fe626`, which holds #1504; also `983b070d4` and `b7f544005` - Runtime and platform: Node 24.18.0, Linux x64, fake home, clean environment - Other: [Hermes Agent](https://github.com/NousResearch/hermes-agent) ([MIT](https://github.com/NousResearch/hermes-agent/blob/main/LICENSE)) docs and source at `dce1e9b`, read only </details> 🤖 Generated with Claude Code (Opus 5.5) 🦊
bsakaguchi 2026-10-15 18:25:47 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
morluto/rea#518
No description provided.