nexu-io/open-design · error · SystemExit

imagegen jobs are not complete; run pet_job_status.py and fi

Error message

imagegen jobs are not complete; run pet_job_status.py and finish: {', '.join(incomplete)}

What it means

Raised by require_complete_jobs when one or more jobs have a status other than 'complete' (status defaults to 'pending' when absent). Finalize refuses to run until every job in the manifest reports complete, and the message lists the offending job ids.

Source

Thrown at skills/hatch-pet/scripts/finalize_pet_run.py:193

            f"job {job_id} source image is not a built-in $imagegen output under "
            f"{generated_root}/.../ig_*.png"
        )
    validate_hash(job, source=source, output=output, job_id=job_id)


def require_complete_jobs(run_dir: Path, *, allow_synthetic_test_sources: bool) -> None:
    manifest_path = run_dir / "imagegen-jobs.json"
    manifest = load_json(manifest_path)
    jobs = manifest.get("jobs")
    if not isinstance(jobs, list):
        raise SystemExit("invalid imagegen-jobs.json: jobs must be a list")
    incomplete = [
        str(job.get("id"))
        for job in jobs
        if isinstance(job, dict) and job.get("status", "pending") != "complete"
    ]
    if incomplete:
        raise SystemExit(
            "imagegen jobs are not complete; run pet_job_status.py and finish: "
            + ", ".join(incomplete)
        )
    for job in jobs:
        if isinstance(job, dict):
            validate_completed_job_source(
                job,
                run_dir=run_dir,
                allow_synthetic_test_sources=allow_synthetic_test_sources,
            )


def review_failures(review: dict[str, object]) -> list[str]:
    rows = review.get("rows")
    if not isinstance(rows, list):
        return ["review did not contain row-level results"]
    failures = []
    for row in rows:

View on GitHub (pinned to 5be4028344)

Solutions

  1. Run pet_job_status.py to see current statuses, then drive each incomplete job to completion via $imagegen or generate_pet_images.py.
  2. If a job was reopened by queue_pet_repairs.py, regenerate that row with $imagegen and re-record the result.
  3. Re-run finalize_pet_run.py only after pet_job_status.py shows all jobs complete.
Defensive patterns

Strategy: validation

Validate before calling

incomplete = [str(j.get('id')) for j in jobs if isinstance(j, dict) and j.get('status','pending') != 'complete']
if incomplete:
    raise RuntimeError(f'finish jobs first: {incomplete}')

Prevention

When it happens

Trigger: Any job dict where job.get('status','pending') != 'complete' is collected into the incomplete list; if that list is non-empty, finalize aborts and names the ids.

Common situations: Invoking finalize before all $imagegen jobs have finished; a job stuck in 'pending' or 'running' after a failed imagegen attempt; a job reopened by queue_pet_repairs.py that was never re-run.

Related errors


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