{"record":{"id":"6e78961159eea17d","repo":"nexu-io/open-design","slug":"job-job-id-was-marked-as-a-local-synthetic-row","errorCode":null,"errorMessage":"job {job_id} was marked as a local/synthetic row ({', '.join(blocked_flags)}); regenerate it with $imagegen","messagePattern":"job (.+?) was marked as a local/synthetic row \\((.+?)\\); regenerate it with \\$imagegen","errorType":"exception","errorClass":"SystemExit","httpStatus":null,"severity":"error","filePath":"skills/hatch-pet/scripts/finalize_pet_run.py","lineNumber":139,"sourceCode":"\n\ndef validate_completed_job_source(\n    job: dict[str, object],\n    *,\n    run_dir: Path,\n    allow_synthetic_test_sources: bool,\n) -> None:\n    job_id = str(job.get(\"id\") or \"\")\n    source = manifest_path(job.get(\"source_path\"), run_dir=run_dir, field=\"source_path\", job_id=job_id)\n    output = manifest_path(job.get(\"output_path\"), run_dir=run_dir, field=\"output_path\", job_id=job_id)\n\n    blocked_flags = [\n        flag\n        for flag in (\"deterministic_pet_row\", \"cute_raster_row\", \"local_raster_row\")\n        if job.get(flag)\n    ]\n    if blocked_flags:\n        raise SystemExit(\n            f\"job {job_id} was marked as a local/synthetic row ({', '.join(blocked_flags)}); \"\n            \"regenerate it with $imagegen\"\n        )\n\n    if job.get(\"synthetic_test_source\"):\n        if not allow_synthetic_test_sources:\n            raise SystemExit(\n                f\"job {job_id} uses a synthetic test source; rerun with real $imagegen output\"\n            )\n        validate_hash(job, source=source, output=output, job_id=job_id)\n        return\n\n    if job.get(\"secondary_fallback\"):\n        if job.get(\"source_provenance\") != \"secondary-fallback-image-api\":\n            raise SystemExit(f\"job {job_id} has invalid secondary fallback provenance\")\n        validate_hash(job, source=source, output=output, job_id=job_id)\n        return\n","sourceCodeStart":121,"sourceCodeEnd":157,"githubUrl":"https://github.com/nexu-io/open-design/blob/5be4028344c2eb4c667c5a97bda8f750c5597ef7/skills/hatch-pet/scripts/finalize_pet_run.py#L121-L157","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Regenerate each flagged job with the real $imagegen tool so the blocked flag is removed and source_provenance becomes built-in-imagegen.","Edit imagegen-jobs.json only to delete the flagged rows, then re-run the imagegen job creator to re-add them as real jobs.","Re-run finalize_pet_run.py once no job carries a blocked flag."],"exampleFix":"// before (imagegen-jobs.json job entry)\n{\"id\":\"running\",\"cute_raster_row\":true,...}\n// after\n{\"id\":\"running\",\"source_provenance\":\"built-in-imagegen\",...}","handlingStrategy":"validation","validationCode":"blocked = [f for f in ('deterministic_pet_row','cute_raster_row','local_raster_row') if job.get(f)]\nif blocked:\n    raise RuntimeError(f'job {job[\"id\"]} carries blocked local/synthetic flags: {blocked}')","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Do not ship manifests produced by local rasterizers; regenerate rows with $imagegen.","Keep dev/test raster manifests in a separate run_dir from production runs.","Lint imagegen-jobs.json for blocked flags before finalize."],"tags":["manifest","provenance","synthetic","pet-pipeline"],"backgroundTag":null,"analyzedSha":"5be4028344c2eb4c667c5a97bda8f750c5597ef7","analyzedAt":"2026-08-12T12:03:58.812Z","schemaVersion":2},"datasetVersion":"2026-08-12T18:17:37.767Z"}