{"record":{"id":"356067ea0764453e","repo":"nexu-io/open-design","slug":"unknown-job-id-s-join-sorted-missing","errorCode":null,"errorMessage":"unknown job id(s): {', '.join(sorted(missing))}","messagePattern":"unknown job id\\(s\\): (.+?)","errorType":"exception","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"skills/hatch-pet/scripts/generate_pet_images.py","lineNumber":70,"sourceCode":"    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)\n    if not selected_ids:\n        if not skip_base:\n            selected_ids.add(\"base\")\n        selected_ids.update(states)\n    selected = [job for job in manifest_jobs(manifest) if job.get(\"id\") in selected_ids]\n    missing = selected_ids - {str(job.get(\"id\")) for job in selected}\n    if missing:\n        raise SystemExit(f\"unknown job id(s): {', '.join(sorted(missing))}\")\n    return selected\n\n\ndef _multipart_body(fields: list[tuple]) -> tuple[bytes, str]:\n    boundary = uuid.uuid4().hex\n    parts = []\n    for name, value in fields:\n        if isinstance(value, tuple):\n            fname, data, ct = value\n            parts.append(\n                f'--{boundary}\\r\\nContent-Disposition: form-data; name=\"{name}\"; filename=\"{fname}\"\\r\\nContent-Type: {ct}\\r\\n\\r\\n'.encode()\n                + data + b\"\\r\\n\"\n            )\n        else:\n            parts.append(f'--{boundary}\\r\\nContent-Disposition: form-data; name=\"{name}\"\\r\\n\\r\\n{value}\\r\\n'.encode())\n    parts.append(f\"--{boundary}--\\r\\n\".encode())\n    return b\"\".join(parts), f\"multipart/form-data; boundary={boundary}\"\n","sourceCodeStart":52,"sourceCodeEnd":88,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/skills/hatch-pet/scripts/generate_pet_images.py#L52-L88","documentation":"Raised by select_jobs in generate_pet_images.py when one or more requested job ids (from --job-id, or the defaults: 'base' plus every entry in --states) cannot be found among the manifest's job ids. The missing ids are reported sorted.","triggerScenarios":"selected_ids (explicit --job-id values, or 'base' + the parsed states) contains an id that does not match any job.get('id') in the manifest.","commonSituations":"Passing --job-id for a job that was never created; using --skip-base when 'base' was expected but the manifest lacks it; a state name that does not correspond to a job id in this manifest.","solutions":["Inspect imagegen-jobs.json and list the existing job ids; only pass ids that appear there.","If 'base' is missing, either create it or pass --skip-base.","Use --states all to target exactly the states that have corresponding jobs."],"exampleFix":"// before\ngenerate_pet_images.py --run-dir r --job-id sleep\n// after\ngenerate_pet_images.py --run-dir r --job-id idle","handlingStrategy":"validation","validationCode":"known_ids = {str(j.get('id')) for j in jobs}\nrequested = set(args.job_id) or ({'base'} if not args.skip_base else set()) | set(states)\nif missing := requested - known_ids:\n    raise ValueError(f'unknown job ids: {sorted(missing)}')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["List job ids from imagegen-jobs.json before passing --job-id.","Pass --skip-base only when the manifest genuinely has no base job.","Prefer --states all to match the jobs that actually exist."],"tags":["cli","job-id","manifest","pet-pipeline"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}