{"record":{"id":"79dccdddfdae3bf3","repo":"NousResearch/hermes-agent","slug":"base-image-not-found-base","errorCode":null,"errorMessage":"base image not found: {base}","messagePattern":"base image not found: (.+?)","errorType":"exception","errorClass":"GenerationError","httpStatus":null,"severity":"error","filePath":"agent/pet/generate/orchestrate.py","lineNumber":221,"sourceCode":"    style: str = \"auto\",\n    on_progress: ProgressFn | None = None,\n    provider: SpriteProvider | None = None,\n    is_cancelled: Callable[[], bool] | None = None,\n) -> HatchResult:\n    \"\"\"Turn an approved base image into a full, installed Hermes pet.\n\n    Generates a grounded row strip per state, extracts frames, composes +\n    validates the atlas, and registers it. The idle row falls back to the base\n    look so the pet always renders. Raises :class:`GenerationError` on failure.\n\n    *is_cancelled*, when supplied, is polled cooperatively: rows that haven't\n    started are skipped, queued rows are cancelled, and once every row is done we\n    abort (raising :class:`GenerationError`) before composing/saving so a stopped\n    hatch never writes a half-built pet.\n    \"\"\"\n    base = Path(base_image)\n    if not base.is_file():\n        raise GenerationError(f\"base image not found: {base}\")\n\n    sprite = provider or imagegen.resolve_provider(require_references=True)\n    progress = on_progress or (lambda *_: None)\n    cancelled = is_cancelled or (lambda: False)\n    label = concept or display_name or slug\n\n    frames_by_state: dict[str, list] = {}\n    total_rows = len(atlas.ROW_SPECS)\n    logger.info(\"pet hatch %r: generating %d animation rows\", slug, total_rows)\n\n    # Generate every state's row strip concurrently — they're independent\n    # grounded calls, so the hatch waits for the slowest row, not their sum. A\n    # single row failing is tolerated (idle is guaranteed below).\n    def _gen_row(spec: tuple[str, int, int]) -> tuple[str, list | None]:\n        state, _row, count = spec\n        if cancelled():\n            return state, None\n        t0 = time.monotonic()","sourceCodeStart":203,"sourceCodeEnd":239,"githubUrl":"https://github.com/NousResearch/hermes-agent/blob/c896c09c42910c584c4c7d2325b58c14713ea42c/agent/pet/generate/orchestrate.py#L203-L239","documentation":"Error \"base image not found: {base}\" thrown in NousResearch/hermes-agent.","triggerScenarios":"Thrown at agent/pet/generate/orchestrate.py:221 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Restore or regenerate the base image at the expected path.","Verify the generation pipeline wrote the base image before composing."],"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"}