{"record":{"id":"993d7a3711490dc5","repo":"NousResearch/hermes-agent","slug":"unknown-skill-s-missing-display","errorCode":null,"errorMessage":"Unknown skill(s): {missing_display}","messagePattern":"Unknown skill\\(s\\): (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"cli.py","lineNumber":7482,"sourceCode":"            return\n        skills_prompt, loaded_skills, missing_skills = result\n        if missing_skills:\n            missing_display = \", \".join(missing_skills)\n            # If at least one skill loaded, degrade gracefully: skip the\n            # unknown ones and continue. A typo'd skill name should not crash\n            # the worker (which auto-blocks the Kanban task after retries).\n            # Only when EVERY requested skill is missing do we hard-fail, so a\n            # fully-misconfigured worker fails loudly instead of running blind.\n            if loaded_skills:\n                logger.warning(\n                    \"Unknown skill(s) requested, skipping: %s. \"\n                    \"Continuing with: %s. \"\n                    \"List available skills with `hermes skills list`.\",\n                    missing_display,\n                    \", \".join(loaded_skills),\n                )\n            else:\n                raise ValueError(f\"Unknown skill(s): {missing_display}\")\n        if skills_prompt:\n            self.system_prompt = \"\\n\\n\".join(\n                part for part in (self.system_prompt, skills_prompt) if part\n            ).strip()\n            self.preloaded_skills = loaded_skills\n\n    def show_banner(self):\n        \"\"\"Display the welcome banner in Claude Code style.\"\"\"\n        self.console.clear()\n        ctx_len = None\n        if hasattr(self, 'agent') and self.agent and hasattr(self.agent, 'context_compressor'):\n            ctx_len = self.agent.context_compressor.context_length\n        \n        # Auto-compact for narrow terminals — the full banner with caduceus\n        # + tool list needs ~80 columns minimum to render without wrapping.\n        term_width = shutil.get_terminal_size().columns\n        use_compact = self.compact or term_width < 80\n        ","sourceCodeStart":7464,"sourceCodeEnd":7500,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/cli.py#L7464-L7500","documentation":"Raised by skill preloading when the caller requested a set of skills and NONE of them resolve to installed skills. This is a deliberate hard-fail (the comment notes it applies to Kanban workers) so a fully misconfigured worker fails loudly instead of running blind. If at least one requested skill loaded, the code only logs a warning and continues.","triggerScenarios":"Starting the CLI (or a Kanban worker spawn) with a skills list where every name is unknown: e.g. `hermes --skills reserch-daily,report-writer` where neither exists under the skills directories, or a kanban task assigning skills that were never installed/renamed.","commonSituations":"Typo in a skill name, referencing a skill that lives in optional-skills but was never installed via `hermes skills install`, a skill renamed or archived by the curator, or a profile whose HERMES_HOME lacks the skill the task expects.","solutions":["Run `hermes skills list` and compare against the requested names","Fix typos / use the exact skill directory name","If the skill is in optional-skills, install it: `hermes skills install official/<category>/<skill>`","If a curator archive ate it, restore with `hermes curator restore <skill>`"],"exampleFix":"# before\ncli --skills reserch-daily  # ValueError: Unknown skill(s): reserch-daily\n\n# after\nhermes skills list            # discover exact name 'research-daily'\ncli --skills research-daily","handlingStrategy":"validation","validationCode":"from pathlib import Path\nfrom hermes_constants import get_hermes_home\n\ndef known_skills(requested: list[str]) -> set[str]:\n    installed = {p.name for p in (get_hermes_home() / \"skills\").iterdir() if p.is_dir()}\n    return set(requested) & installed","typeGuard":null,"tryCatchPattern":"try:\n    cli.preload_skills(skills=[\"research-daily\"])\nexcept ValueError as e:\n    if str(e).startswith(\"Unknown skill(s)\"):\n        missing = [s for s in e.args[0].split(\": \", 1)[1].split(\", \")]\n        raise SystemExit(f\"Install or fix: {missing}; see `hermes skills list`\") from e\n    raise","preventionTips":["Run `hermes skills list` and copy names exactly before referencing them","In automation, resolve skill names against the installed set before spawning workers","Install optional skills explicitly with `hermes skills install official/<cat>/<name>`"],"tags":["skills","cli","kanban","configuration"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}