nexu-io/open-design · error · SystemExit

unknown job id(s): {', '.join(sorted(missing))}

Error message

unknown job id(s): {', '.join(sorted(missing))}

What it means

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.

Source

Thrown at skills/hatch-pet/scripts/generate_pet_images.py:70

    return [job for job in jobs if isinstance(job, dict)]


def select_jobs(
    manifest: dict[str, object],
    *,
    states: list[str],
    skip_base: bool,
    job_ids: list[str],
) -> list[dict[str, object]]:
    selected_ids = set(job_ids)
    if not selected_ids:
        if not skip_base:
            selected_ids.add("base")
        selected_ids.update(states)
    selected = [job for job in manifest_jobs(manifest) if job.get("id") in selected_ids]
    missing = selected_ids - {str(job.get("id")) for job in selected}
    if missing:
        raise SystemExit(f"unknown job id(s): {', '.join(sorted(missing))}")
    return selected


def _multipart_body(fields: list[tuple]) -> tuple[bytes, str]:
    boundary = uuid.uuid4().hex
    parts = []
    for name, value in fields:
        if isinstance(value, tuple):
            fname, data, ct = value
            parts.append(
                f'--{boundary}\r\nContent-Disposition: form-data; name="{name}"; filename="{fname}"\r\nContent-Type: {ct}\r\n\r\n'.encode()
                + data + b"\r\n"
            )
        else:
            parts.append(f'--{boundary}\r\nContent-Disposition: form-data; name="{name}"\r\n\r\n{value}\r\n'.encode())
    parts.append(f"--{boundary}--\r\n".encode())
    return b"".join(parts), f"multipart/form-data; boundary={boundary}"

View on GitHub (pinned to 5be4028344)

Solutions

  1. Inspect imagegen-jobs.json and list the existing job ids; only pass ids that appear there.
  2. If 'base' is missing, either create it or pass --skip-base.
  3. Use --states all to target exactly the states that have corresponding jobs.

Example fix

// before
generate_pet_images.py --run-dir r --job-id sleep
// after
generate_pet_images.py --run-dir r --job-id idle
Defensive patterns

Strategy: validation

Validate before calling

known_ids = {str(j.get('id')) for j in jobs}
requested = set(args.job_id) or ({'base'} if not args.skip_base else set()) | set(states)
if missing := requested - known_ids:
    raise ValueError(f'unknown job ids: {sorted(missing)}')

Prevention

When it happens

Trigger: 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.

Common situations: 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.

Related errors


AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12). Data as JSON: /api/errors/356067ea0764453e. Report an issue: GitHub.