nexu-io/open-design · error · SystemExit

unknown job id: {job_id}

Error message

unknown job id: {job_id}

What it means

Raised by find_job() in record_imagegen_result.py when no job in the manifest has id == --job-id. The recorder must update a specific job record (status, hashes, grounding), so an unmatched job id aborts before touching the manifest.

Source

Thrown at skills/hatch-pet/scripts/record_imagegen_result.py:36

def load_jobs(path: Path) -> dict[str, object]:
    if not path.exists():
        raise SystemExit(f"job manifest not found: {path}")
    return json.loads(path.read_text(encoding="utf-8"))


def job_list(manifest: dict[str, object]) -> list[dict[str, object]]:
    jobs = manifest.get("jobs")
    if not isinstance(jobs, list):
        raise SystemExit("invalid imagegen-jobs.json: jobs must be a list")
    return [job for job in jobs if isinstance(job, dict)]


def find_job(manifest: dict[str, object], job_id: str) -> dict[str, object]:
    for job in job_list(manifest):
        if job.get("id") == job_id:
            return job
    raise SystemExit(f"unknown job id: {job_id}")


def image_metadata(path: Path) -> dict[str, object]:
    with Image.open(path) as image:
        image.verify()
    with Image.open(path) as image:
        return {
            "width": image.width,
            "height": image.height,
            "mode": image.mode,
            "format": image.format,
        }


def file_sha256(path: Path) -> str:
    digest = hashlib.sha256()
    with path.open("rb") as file:
        for chunk in iter(lambda: file.read(1024 * 1024), b""):

View on GitHub (pinned to 5be4028344)

Solutions

  1. List valid ids: jq '.jobs[].id' run_dir/imagegen-jobs.json.
  2. Pass the exact matching --job-id (watch case and hyphenation).
  3. If the id should exist, re-run prepare_pet_run.py --force with the intended rows.
  4. Confirm --run-dir matches the run that owns the job id.

Example fix

# before
record_imagegen_result.py --job-id Idle --source ig_001.png
# after
record_imagegen_result.py --job-id idle --source ig_001.png
Defensive patterns

Strategy: validation

Validate before calling

ids = {j.get("id") for j in job_list(manifest)}
if args.job_id not in ids:
    raise SystemExit(f"--job-id {args.job_id} not in {sorted(ids)}")

Prevention

When it happens

Trigger: Passing a --job-id that does not exist in imagegen-jobs.json; typo in the id; manifest was regenerated with a different row set; --job-id from a different pet's run.

Common situations: Recording output for a row that was renamed since prepare; copy-pasting a job id from another run; case mismatch (Idle vs idle).

Related errors


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