{"record":{"id":"407d05605a1e15f5","repo":"nexu-io/open-design","slug":"job-manifest-not-found-path-407d05","errorCode":null,"errorMessage":"job manifest not found: {path}","messagePattern":"job manifest not found: (.+?)","errorType":"exception","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"skills/hatch-pet/scripts/generate_pet_images.py","lineNumber":44,"sourceCode":"    \"review\",\n]\nCANONICAL_BASE_PATH = \"references/canonical-base.png\"\n\n\ndef parse_states(raw: str) -> list[str]:\n    if raw.strip().lower() == \"all\":\n        return ALL_STATES\n    states = [item.strip() for item in raw.split(\",\") if item.strip()]\n    unknown = sorted(set(states) - set(ALL_STATES))\n    if unknown:\n        raise SystemExit(f\"unknown state(s): {', '.join(unknown)}\")\n    return states\n\n\ndef load_manifest(run_dir: Path) -> dict[str, object]:\n    path = run_dir / \"imagegen-jobs.json\"\n    if not path.exists():\n        raise SystemExit(f\"job manifest not found: {path}\")\n    return json.loads(path.read_text(encoding=\"utf-8\"))\n\n\ndef manifest_jobs(manifest: dict[str, object]) -> list[dict[str, object]]:\n    jobs = manifest.get(\"jobs\")\n    if not isinstance(jobs, list):\n        raise SystemExit(\"invalid imagegen-jobs.json: jobs must be a list\")\n    return [job for job in jobs if isinstance(job, dict)]\n\n\ndef select_jobs(\n    manifest: dict[str, object],\n    *,\n    states: list[str],\n    skip_base: bool,\n    job_ids: list[str],\n) -> list[dict[str, object]]:\n    selected_ids = set(job_ids)","sourceCodeStart":26,"sourceCodeEnd":62,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/skills/hatch-pet/scripts/generate_pet_images.py#L26-L62","documentation":"Raised by load_manifest in generate_pet_images.py when <run_dir>/imagegen-jobs.json does not exist on disk. The fallback generator requires a pre-existing manifest to know which jobs to (re)generate, so a missing manifest is a hard stop.","triggerScenarios":"Path(run_dir/'imagegen-jobs.json').exists() is false. Typically a wrong --run-dir or a run that was never initialized by the job-creation step.","commonSituations":"Passing a --run-dir that does not contain the pet run; running generate_pet_images.py before the manifest was created; the manifest file was deleted or never written by a prior failed step.","solutions":["Confirm --run-dir points at the directory containing imagegen-jobs.json.","Run the skill's job-creation/request step first so imagegen-jobs.json is written into run_dir.","Restore imagegen-jobs.json from git or a backup if it was deleted mid-run."],"exampleFix":null,"handlingStrategy":"validation","validationCode":"manifest = run_dir / 'imagegen-jobs.json'\nif not manifest.exists():\n    raise FileNotFoundError(f'no manifest at {manifest}; run the job-creation step first')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Confirm --run-dir contains imagegen-jobs.json before running generate_pet_images.py.","Create the manifest via the skill's request/job-creation step first.","Keep manifests under version control or backed up mid-run."],"tags":["filesystem","manifest","cli","pet-pipeline"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}