Skip to content

fix(skills): classify bundled skills by dir_name when frontmatter name differs#11

Draft
dsr-restyn wants to merge 4 commits into
mainfrom
fix/issue-5433-skills-builtin-misclassification
Draft

fix(skills): classify bundled skills by dir_name when frontmatter name differs#11
dsr-restyn wants to merge 4 commits into
mainfrom
fix/issue-5433-skills-builtin-misclassification

Conversation

@dsr-restyn

Copy link
Copy Markdown
Owner

Summary

When a bundled skill's SKILL.md name frontmatter differs from its directory name, do_list() fails to recognise it as builtin and shows it as local instead.

Root cause: tools/skills_sync.py stores manifest entries keyed by directory name (e.g. vllm), while tools/skills_tool._find_all_skills() returns the frontmatter name field (e.g. serving-llms-vllm). The check elif name in builtin_names in hermes_cli/skills_hub.do_list() only compared frontmatter name, so mismatched entries always fell through to the local branch.

Fix:

  • _find_all_skills() now includes dir_name (the skill directory's basename) in each returned dict — a purely additive field.
  • do_list() falls back to skill.get("dir_name") in builtin_names when the frontmatter name doesn't match, covering all mismatch cases without requiring any manifest migration.

Affected skills (per the issue report): audiocraft-audio-generation, evaluating-llms-harness, fine-tuning-with-trl, gguf-quantization, modal-serverless-gpu, peft-fine-tuning, segment-anything-model, serving-llms-vllm, stable-diffusion-image-generation.

Upstream Issue

Fixes NousResearch#5433

Testing

  • All 10 existing tests/hermes_cli/test_skills_hub.py tests pass.
  • Added test_do_list_builtin_by_dir_name_when_frontmatter_differs which directly reproduces the mismatch scenario (dir_name='vllm', frontmatter name='serving-llms-vllm') and asserts the skill is classified as builtin, not local.
  • Full skills test suite: 488 passed, 3 skipped.

⚠️ Draft — awaiting review before submitting upstream.

dsr-restyn and others added 4 commits April 4, 2026 12:33
/btw is designed to answer ephemeral side questions concurrently while an
agent is working. When a running agent existed, the gateway was sending /btw
as an interrupt to that agent (lines 1871-1876) and returning before ever
reaching the command dispatch at line 1878.

/approve and /deny already had this bypass pattern (they need it because the
agent thread is blocked on a threading.Event). /btw needs the same treatment
for the opposite reason: it should run concurrently, not interrupt.

Fix: add /btw to the early-intercept check block, routing directly to
_handle_btw_command regardless of running-agent state.

Adds regression test: tests/gateway/test_btw_bypass.py
…e differs

Fixes NousResearch#5433 in NousResearch/hermes-agent

skills_sync stores bundled manifest entries by directory name (e.g. 'vllm'),
but _find_all_skills() returns the SKILL.md frontmatter name (e.g. 'serving-llms-vllm').
When these differ, do_list() fails to match the skill against the manifest,
misclassifying it as 'local' instead of 'builtin'.

Fix: _find_all_skills() now includes 'dir_name' in each skill dict, and
do_list() falls back to checking dir_name against the manifest when the
frontmatter name is not found. No manifest migration required.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug]: hermes skills list uses frontmatter name while bundled manifest uses directory name, causing builtin skills to appear as local

1 participant