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
- Run pet_job_status.py to see current statuses, then drive each incomplete job to completion via $imagegen or generate_pet_images.py.
- If a job was reopened by queue_pet_repairs.py, regenerate that row with $imagegen and re-record the result.
- 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
- Run pet_job_status.py and confirm all-complete before invoking finalize.
- Drive reopened repair jobs back to complete via $imagegen.
- Treat any non-complete status as a blocker, not a skip.
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
- running-left mirror source must be decoded/running-right.png
- running-left mirror output must be decoded/running-left.png
- job {job_id} was marked as a local/synthetic row ({', '.join
- job {job_id} has invalid secondary fallback provenance
- job {job_id} was not recorded as a built-in $imagegen output
AI-assisted analysis of nexu-io/open-design@5be4028344 (2026-08-12).
Data as JSON: /api/errors/7c8022eccf1e9abc.
Report an issue: GitHub.