{"record":{"id":"4e79b87562433373","repo":"NousResearch/hermes-agent","slug":"pet-slug-is-not-in-the-petdex-manifest","errorCode":null,"errorMessage":"pet '{slug}' is not in the petdex manifest","messagePattern":"pet '(.+?)' is not in the petdex manifest","errorType":"exception","errorClass":"PetStoreError","httpStatus":null,"severity":"error","filePath":"agent/pet/store.py","lineNumber":170,"sourceCode":"def install_pet(slug: str, *, force: bool = False, timeout: float = _DOWNLOAD_TIMEOUT) -> InstalledPet:\n    \"\"\"Download *slug* from the manifest into the pets directory.\n\n    Idempotent: a fully-installed pet is returned as-is unless *force*.  Raises\n    :class:`PetStoreError` / :class:`~agent.pet.manifest.ManifestError` on\n    failure.\n    \"\"\"\n    from agent.pet.manifest import find_entry\n\n    slug = _safe_slug(slug)\n    if not slug:\n        raise PetStoreError(\"invalid pet slug\")\n    existing = load_pet(slug)\n    if existing and existing.exists and not force:\n        return existing\n\n    entry = find_entry(slug, timeout=timeout)\n    if entry is None:\n        raise PetStoreError(f\"pet '{slug}' is not in the petdex manifest\")\n\n    # Host-pin every asset URL to petdex. The manifest is trusted (HTTPS from\n    # petdex.dev), but pin the asset hosts too so a compromised/spoofed manifest\n    # can't redirect the download at an arbitrary host. Matches thumbnail_png.\n    if not _is_petdex_host(entry.spritesheet_url):\n        raise PetStoreError(f\"refusing non-petdex spritesheet host for '{slug}'\")\n\n    directory = pets_dir() / slug\n    directory.mkdir(parents=True, exist_ok=True)\n\n    sprite_ext = \".png\" if entry.spritesheet_url.lower().split(\"?\")[0].endswith(\".png\") else \".webp\"\n    sprite_path = directory / f\"spritesheet{sprite_ext}\"\n\n    _download(entry.spritesheet_url, sprite_path, timeout=timeout)\n\n    # Fetch the upstream pet.json if present; otherwise synthesize a minimal\n    # one so the local layout is self-describing.\n    meta: dict = {}","sourceCodeStart":152,"sourceCodeEnd":188,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/agent/pet/store.py#L152-L188","documentation":"Error \"pet '{slug}' is not in the petdex manifest\" thrown in NousResearch/hermes-agent.","triggerScenarios":"Thrown at agent/pet/store.py:170 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Choose a pet slug that exists in the petdex manifest.","Refresh the manifest and retry."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"c896c09c42910c584c4c7d2325b58c14713ea42c","analyzedAt":"2026-08-14T17:18:01.089Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}