{"record":{"id":"39a7f71ab0ad7f13","repo":"odysseus-dev/odysseus","slug":"empty-bundle","errorCode":null,"errorMessage":"empty bundle","messagePattern":"empty bundle","errorType":"exception","errorClass":"SkillImportError","httpStatus":null,"severity":"error","filePath":"services/memory/skills.py","lineNumber":397,"sourceCode":"        )\n        self._write_skill(sk)\n\n        return sk.to_dict()\n\n    def import_bundle_from_files(\n        self,\n        files: Dict[str, str],\n        *,\n        owner: Optional[str] = None,\n        source_url: str = \"\",\n        category: str = \"imported\",\n    ) -> Dict:\n        \"\"\"Install a fetched skill bundle (relative path → text) under skills/.\"\"\"\n        from .skill_importer import SkillImportError, pick_skill_md, _safe_relpath\n        from core.atomic_io import atomic_write_text\n\n        if not files:\n            raise SkillImportError(\"empty bundle\")\n        _rel, skill_md = pick_skill_md(files)\n        sk = Skill.from_markdown(skill_md)\n        nm = slugify(sk.name or _rel.split(\"/\")[-2] or \"skill\")\n        cat = slugify(category or sk.category or \"imported\", fallback=\"imported\")\n\n        existing = {s[\"name\"] for s in self.load_all()}\n        base = nm\n        i = 2\n        while nm in existing:\n            nm = f\"{base}-{i}\"\n            i += 1\n\n        skill_dir = self._skill_dir(cat, nm)\n        os.makedirs(skill_dir, exist_ok=True)\n\n        # Preserve bundle layout (templates/, references/, etc.) under the skill dir.\n        for rel, content in files.items():\n            safe = _safe_relpath(rel)","sourceCodeStart":379,"sourceCodeEnd":415,"githubUrl":"https://github.com/odysseus-dev/odysseus/blob/f9235ebbf13f693a6fd29ce70b097f6ec83705bf/services/memory/skills.py#L379-L415","documentation":"Error \"empty bundle\" thrown in odysseus-dev/odysseus.","triggerScenarios":"Triggered when the corresponding server-side validation or runtime check at the recorded location rejects the request or operation and returns this error message to the caller.","commonSituations":"See trigger scenarios.","solutions":["Provide a non-empty skill bundle.","Check the import source; it produced no files."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"f9235ebbf13f693a6fd29ce70b097f6ec83705bf","analyzedAt":"2026-08-14T21:47:48.359Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}