# NousResearch/hermes-agent · External skills resolving incorrect skill_dir in _load_skill_payload

## Open now

- Nothing open on GitHub.

The three members share one theme: _load_skill_payload reportedly rebuilds the wrong skill_dir for skills from skills.external_dirs. One is a bug report and two are fix proposals, one of which uses an absolute skill_dir; titles alone do not show their status or outcome.

## TL;DR

- 3 member(s): 0 open issue(s), 1 closed issue(s), 0 open PR(s), 1 merged PR(s), 1 PR(s) closed without merging.
- A fix was merged to main in PR #10587. Verify it addresses your case.
- **Recommended:** read PR #10587 (and any competing PRs below) before filing. Confirm the merged change covers your symptom.

## Maintainer resolution verdict

- Internal-tracker verdict over this cluster's issue members: `resolved` · deciding PR(s): `pr-10587`. This is distinct from the fix status above. Weigh it yourself.

## How this cluster was grouped

- Link evidence (`STRUCTURAL_SPANNING`): every member is connected by structural evidence: shared changed files, or a closing/superseded reference.
- Pairwise link density `0.67`: the share of member pairs that carry a link, counting a structural link in full and a relevance-only link at 0.36. `1.00` means every pair is linked.

## Closed / duplicate issues

- #10313: Bug: _load_skill_payload rebuilds wrong skill_dir for external skills (from skills.external_dirs)

## Prior & competing PRs

- **#10587: fix: use absolute skill_dir for external skills**. merged to main · fix tier `verified`
  - maintainer direction: category `merged`
  - files: `agent/skill_commands.py`, `tools/skills_tool.py`
  - fix hunks:
  - `agent/skill_commands.py`

    ```diff
    @@ -72,7 +72,14 @@ def _load_skill_payload(skill_identifier: str, task_id: str | None = None) -> tu
         skill_name = str(loaded_skill.get("name") or normalized)
         skill_path = str(loaded_skill.get("path") or "")
         skill_dir = None
    -    if skill_path:
    +    # Prefer the absolute skill_dir returned by skill_view() — this is
    +    # correct for both local and external skills.  Fall back to the old
    +    # SKILLS_DIR-relative reconstruction only when skill_dir is absent
    +    # (e.g. legacy skill_view responses).
    +    abs_skill_dir = loaded_skill.get("skill_dir")
    +    if abs_skill_dir:
    +        skill_dir = Path(abs_skill_dir)
    +    elif skill_path:
             try:
                 skill_dir = SKILLS_DIR / Path(skill_path).parent
             except Exception:
    ```
  - `tools/skills_tool.py`

    ```diff
    @@ -1263,6 +1263,7 @@ def skill_view(name: str, file_path: str = None, task_id: str = None) -> str:
                 "related_skills": related_skills,
                 "content": content,
                 "path": rel_path,
    +            "skill_dir": str(skill_dir) if skill_dir else None,
                 "linked_files": linked_files if linked_files else None,
                 "usage_hint": "To view linked files, call skill_view(name, file_path) where file_path is e.g. 'references/api.md' or 'assets/config.yaml'"
                 if linked_files
    ```
- **#10348: fix(skills): resolve correct skill_dir for external skills in _load_skill_payload**. closed without merge
  - maintainer direction: category `implemented_elsewhere`; implication `superseded`; refs `4fdcae6c9`, `#10313`, `#10587`

## Fix status

- Merged to main in PR #10587 (cited above). No release data is tracked. Verify downstream.
- Fix last verified (merged) `2026-04-16`. This confirmation is old and may be out of date (a revert/reopen would not have invalidated it here); re-verify.
