{"record":{"id":"0b61ef06f3d4482a","repo":"NousResearch/hermes-agent","slug":"no-bundle-at-path","errorCode":null,"errorMessage":"No bundle at {path}","messagePattern":"No bundle at (.+?)","errorType":"exception","errorClass":"FileNotFoundError","httpStatus":null,"severity":"error","filePath":"agent/skill_bundles.py","lineNumber":429,"sourceCode":"    if instruction:\n        payload[\"instruction\"] = instruction\n\n    path.write_text(\n        yaml.safe_dump(payload, sort_keys=False, allow_unicode=True),\n        encoding=\"utf-8\",\n    )\n    scan_bundles()  # refresh cache\n    return path\n\n\ndef delete_bundle(name: str) -> Path:\n    \"\"\"Delete a bundle by name. Returns the deleted path.\n\n    Raises ``FileNotFoundError`` if the bundle doesn't exist.\n    \"\"\"\n    path = bundle_path_for(name)\n    if not path.exists():\n        raise FileNotFoundError(f\"No bundle at {path}\")\n    path.unlink()\n    scan_bundles()\n    return path\n\n\ndef get_bundle(name: str) -> Optional[Dict[str, Any]]:\n    \"\"\"Look up a bundle by name (slug-normalized).\"\"\"\n    slug = _slugify(name)\n    return get_skill_bundles().get(f\"/{slug}\")\n","sourceCodeStart":411,"sourceCodeEnd":439,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/agent/skill_bundles.py#L411-L439","documentation":"Raised by delete_bundle() in agent/skill_bundles.py when the bundle file resolved from bundle_path_for(name) does not exist. Because names are slug-normalized, the file checked may differ from the string you passed. It signals a delete against a nonexistent (or differently-slugged) bundle.","triggerScenarios":"Calling delete_bundle(name) where no bundle file exists at the slug-normalized path; calling delete twice in a row; passing a display name whose slug does not match the stored bundle's slug; concurrent deletion by another process.","commonSituations":"Cleanup scripts that assume a bundle exists; retry logic after a partially-failed run already deleted the file; name/slug mismatch after renaming a bundle manually in the YAML.","solutions":["Check existence first with get_bundle(name) (returns None when absent) or list bundles via get_skill_bundles().","Catch FileNotFoundError and treat it as a no-op if idempotent deletion is intended.","Verify you are using the bundle's slug (the key form '/<slug>' in get_skill_bundles()) rather than an unrelated display name."],"exampleFix":"# before\ndelete_bundle(\"research\")\n\n# after\nif get_bundle(\"research\") is not None:\n    delete_bundle(\"research\")\n# or:\ntry:\n    delete_bundle(\"research\")\nexcept FileNotFoundError:\n    pass  # already gone","handlingStrategy":"validation","validationCode":"from agent.skill_bundles import get_bundle\n\nif get_bundle(name) is None:\n    print(f\"no bundle named {name}; nothing to delete\")\nelse:\n    delete_bundle(name)","typeGuard":null,"tryCatchPattern":"try:\n    delete_bundle(name)\nexcept FileNotFoundError:\n    pass  # already deleted; treat as success for idempotent cleanup","preventionTips":["Make delete routines idempotent by catching FileNotFoundError.","Use the bundle slug (the '/<slug>' key form) when addressing bundles.","Avoid concurrent delete/delete races by serializing bundle maintenance in one process."],"tags":["skills","bundles","filesystem","not-found"],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}