nexu-io/open-design · error · SystemExit

job {job_id} was marked as a local/synthetic row ({', '.join

Error message

job {job_id} was marked as a local/synthetic row ({', '.join(blocked_flags)}); regenerate it with $imagegen

What it means

Raised by validate_completed_job_source when a job carries any of the blocked local/synthetic flags (deterministic_pet_row, cute_raster_row, local_raster_row). These markers indicate the row was produced by a local rasterizer rather than the real $imagegen model, which finalize refuses to ship.

Source

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


def validate_completed_job_source(
    job: dict[str, object],
    *,
    run_dir: Path,
    allow_synthetic_test_sources: bool,
) -> None:
    job_id = str(job.get("id") or "")
    source = manifest_path(job.get("source_path"), run_dir=run_dir, field="source_path", job_id=job_id)
    output = manifest_path(job.get("output_path"), run_dir=run_dir, field="output_path", job_id=job_id)

    blocked_flags = [
        flag
        for flag in ("deterministic_pet_row", "cute_raster_row", "local_raster_row")
        if job.get(flag)
    ]
    if blocked_flags:
        raise SystemExit(
            f"job {job_id} was marked as a local/synthetic row ({', '.join(blocked_flags)}); "
            "regenerate it with $imagegen"
        )

    if job.get("synthetic_test_source"):
        if not allow_synthetic_test_sources:
            raise SystemExit(
                f"job {job_id} uses a synthetic test source; rerun with real $imagegen output"
            )
        validate_hash(job, source=source, output=output, job_id=job_id)
        return

    if job.get("secondary_fallback"):
        if job.get("source_provenance") != "secondary-fallback-image-api":
            raise SystemExit(f"job {job_id} has invalid secondary fallback provenance")
        validate_hash(job, source=source, output=output, job_id=job_id)
        return

View on GitHub (pinned to 5be4028344)

Solutions

  1. Regenerate each flagged job with the real $imagegen tool so the blocked flag is removed and source_provenance becomes built-in-imagegen.
  2. Edit imagegen-jobs.json only to delete the flagged rows, then re-run the imagegen job creator to re-add them as real jobs.
  3. Re-run finalize_pet_run.py once no job carries a blocked flag.

Example fix

// before (imagegen-jobs.json job entry)
{"id":"running","cute_raster_row":true,...}
// after
{"id":"running","source_provenance":"built-in-imagegen",...}
Defensive patterns

Strategy: validation

Validate before calling

blocked = [f for f in ('deterministic_pet_row','cute_raster_row','local_raster_row') if job.get(f)]
if blocked:
    raise RuntimeError(f'job {job["id"]} carries blocked local/synthetic flags: {blocked}')

Prevention

When it happens

Trigger: A job dict in imagegen-jobs.json has any of deterministic_pet_row/cute_raster_row/local_raster_row set truthy. Such rows are dev-only placeholders and cannot enter the final spritesheet.

Common situations: Re-using a dev/test manifest that was seeded with cute-raster placeholder rows; running a local rasterizer to fill gaps and forgetting to regenerate those jobs with $imagegen.

Related errors


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