The schema stays stable when the directory changes
The skills page says the skill_manage description renders the configured directory. This checkout's description is a fixed string. A test that changes create_dir asserts that string does not change. I ran it.
William
The skills page says the skill_manage description renders the directory you set in skills.create_dir. I printed that description from this install. No path in it.
If you set the key and then search the tool sentence for your directory, you will not find it. I ran the test that asserts the sentence stays put when the directory changes. It passed. The create goes through a different function. Missing your directory in that sentence does not mean the write ignored the setting.
The page
I curled the skills page this run with a cache-busting query. HTTP 200, 205234 bytes, sha256 ef91dac0abd33c746371e0b3f000b60ded5131469e19b610ca97ccb2b32f05f7, last-modified Mon, 05 Oct 2026 02:47:20 GMT.
The page says every agent-facing instruction that names the skill-creation path, the skill_manage tool description and related prompt text, dynamically renders the configured directory, so the agent is told to create skills there.[1]
The fetch before that, without the cache buster, was the same 205234 bytes and a different sha f26ddc3b9adca8fba14d59812bf7138b5211cd11220aa1182985369bf6c26804. That one was a cache hit, age 21201, last-modified Sun, 04 Oct 2026 20:47:46 GMT, and the date header was still stuck on Sun, 04 Oct 2026 21:08:32 GMT. The same sentence was in that body. Quote the hashed GET you actually received. A HEAD came back last-modified one second earlier than the busted GET, content-length 205234, and I did not receive a body with that HEAD.
This checkout's website markdown has the same sentence at skills.md line 473, with backticks around the tool name. That file is 57427 bytes, sha256 abc4f6d697c551c8298ef100cf2f48ae8e37df8415a2919f4e0975796d1e6605, mtime 2026-09-26 14:33:48 -0400. I did not byte-compare it to the HTML. The live last-modified is October 5. They are not the same object.
The sentence this install prints
_skill_manage_description() returns a fixed string. The schema assigns that return. I printed both in this process. They were equal. Length 904. sha256 of the string 4de4ae0e7174f7d08397770feb2628ee9927410e22734e3c0720e19f169d7ea2.
The string says new skills land in the profile's skills directory or configured skills.create_dir. It names the key. It does not insert a path.
display_skill_create_dir() is the function that would name one. On this profile it returned ~/.hermes/profiles/william/skills/. Those characters are not in the description. The phrase skills.create_dir is.
A search of this checkout for the call display_skill_create_dir( found the definition in skill_utils.py and two asserts in the create_dir test file. No other call. prompt_builder.py and system_prompt.py have no create_dir string. That is those two files, plus a repo search for the function name. It does not prove that no comment anywhere mentions a path.
The docstring on that renderer says tool schema descriptions and prompts follow skills.create_dir. The schema does not call it. In this checkout's hermes_cli/config_defaults.py, the comment on the empty default says that when create_dir is set, agent-facing instructions name this path. I read that comment at lines 1452-1454. sha256 of that file 0d8cf6c0b32310ab7bb4c1c8322d68d6c455a220d82825c5e3e690a84d94dc44. The description function does not do what the comment says.
skill_manager_tool.py in this tree is 47001 bytes, sha256 a5103fa5849fb2e7055cf95e1aa22b2a1790f7e7ee355278340ded979bc68475. skill_utils.py is 34722 bytes, sha256 f12e6a94e930b6b9b4b783dcd06405501e09e14b3e65a5636408df5fdfeb4b72.
What the test asserts
test_tool_schema_stays_stable_when_skill_creation_home_changes writes two different create_dir values and asserts the skill_manage description does not change. I ran that test in this checkout's venv. 1 passed in 0.94s. The fixture is isolated_home. It did not read this profile's config.yaml.
I also ran test_create_lands_in_create_dir and test_skill_manage_schema_stable_but_creation_follows_active_profile. 2 passed in 1.93s. Those fixtures are temporary homes, not this profile. The second test asserts the schema does not contain the configured directory names, does contain the string skills.create_dir, and the created SKILL.md lands under the configured directory rather than the local skills dir. I did not create a skill on this profile.
_resolve_skill_dir calls get_skill_create_dir() and uses that path when it is set. I read that. The passing tests are what I ran.
Unset is a different case
A search of this profile's config.yaml for create_dir returned no matches. The skills section I read has creation_nudge_interval: 15 and no create_dir key. The file is 10855 bytes, sha256 ddb4c2954867c26e598529d1e94ede931e99779191742c927f6d3247e93a480b. get_skill_create_dir() returned None. The renderer still returned the local skills path, because unset falls back to that.
Unset is not the case the page's "what this changes" list is about. The tests are that case. Don't collapse the two.
The tip I read is still a fixed string
This install printed Hermes Agent v0.21.5+4599.g5000e29 (2026.9.24). I read origin/main at 27c02f6326e82b2ba184f5a849f0c5b3a38efb9c via git show, then curled the same blobs from GitHub. The hashes matched. This working tree is not that commit.
skill_manager_tool.py on that commit is 44584 bytes, sha256 bc6cb8f949b74185071aae682d242748fe2c029e906203d61d225d915fefa799. The description function is still a fixed string. It still contains the clause about the profile's skills directory or configured skills.create_dir.[2] The schema still assigns that function. A search of that blob for display_skill_create_dir returned no hits.
The docs file on that commit still has the dynamically-renders sentence, at line 450.[3] skill_utils.py on that commit still says tool schema descriptions and prompts follow skills.create_dir.[4] I did not run the tests against that commit.
What to check
| If you check this | What it meant here |
|---|---|
| The tool description | A fixed sentence. It names the config key. It will not contain your directory. |
| display_skill_create_dir() | Prints the path. The schema does not call it. |
| get_skill_create_dir() | None when unset. The write uses this, not the sentence. |
| A create in the isolated test, with create_dir set | SKILL.md landed under that directory. I did not run a create on this profile. |
| This profile's config | No create_dir key. That is not a failed redirect. Nothing was configured to redirect. |
If you need the path in front of the agent, this checkout's tool description will not show it. Read display_skill_create_dir(), or the path field on a create result. Don't grep the tool sentence and decide the setting failed.
Sources
[1] https://hermes-agent.nousresearch.com/docs/user-guide/features/skills — Skills System [2] https://raw.githubusercontent.com/NousResearch/hermes-agent/27c02f6326e82b2ba184f5a849f0c5b3a38efb9c/tools/skill_manager_tool.py — skill_manager_tool.py at 27c02f63 [3] https://raw.githubusercontent.com/NousResearch/hermes-agent/27c02f6326e82b2ba184f5a849f0c5b3a38efb9c/website/docs/user-guide/features/skills.md — skills.md at 27c02f63 [4] https://raw.githubusercontent.com/NousResearch/hermes-agent/27c02f6326e82b2ba184f5a849f0c5b3a38efb9c/agent/skill_utils.py — skill_utils.py at 27c02f63