nexu-io/open-design · error · SystemExit

job {job.get('id')} does not list input_images; grounded row

Error message

job {job.get('id')} does not list input_images; grounded row jobs must attach references

What it means

Raised by validate_required_grounding() in record_imagegen_result.py for a grounded job (one with allow_prompt_only_generation is False) whose input_images is missing or empty. Grounded row jobs must reference the canonical base/references so the model cannot drift; recording a result without those references attached is rejected.

Source

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

            "source image is inside the pet run directory; record the original "
            "$imagegen output from $CODEX_HOME/generated_images/.../ig_*.png instead"
        )
    generated_root = default_generated_images_root()
    if not is_relative_to(source, generated_root) or not source.name.startswith("ig_"):
        raise SystemExit(
            "source image does not look like a built-in $imagegen output; expected "
            f"{generated_root}/.../ig_*.png. Do not ingest locally drawn or "
            "post-processed row strips as visual job outputs."
        )
    return "built-in-imagegen"


def validate_required_grounding(job: dict[str, object], run_dir: Path) -> None:
    if job.get("allow_prompt_only_generation") is not False:
        return
    inputs = job.get("input_images")
    if not isinstance(inputs, list) or not inputs:
        raise SystemExit(
            f"job {job.get('id')} does not list input_images; grounded row jobs must attach references"
        )
    missing = []
    for item in inputs:
        if not isinstance(item, dict) or not isinstance(item.get("path"), str):
            raise SystemExit(f"job {job.get('id')} has an invalid input image entry")
        path = run_dir / item["path"]
        if not path.is_file():
            missing.append(str(path))
    if missing:
        raise SystemExit(
            f"job {job.get('id')} is missing required grounding image(s): "
            + ", ".join(missing)
        )


def update_base_canonical_reference(
    *,

View on GitHub (pinned to 5be4028344)

Solutions

  1. Add input_images (a non-empty list of {path: ...} entries) to the job in imagegen-jobs.json.
  2. Set allow_prompt_only_generation to true if the job is genuinely prompt-only.
  3. Re-run prepare_pet_run.py --force so grounding references are attached correctly.
  4. Verify the reference files pointed to by input_images exist under run_dir.

Example fix

// before
{"id":"idle","allow_prompt_only_generation":false}
// after
{"id":"idle","allow_prompt_only_generation":false,"input_images":[{"path":"references/canonical-base.png"}]}
Defensive patterns

Strategy: validation

Validate before calling

if job.get("allow_prompt_only_generation") is False:
    inputs = job.get("input_images")
    if not isinstance(inputs, list) or not inputs:
        raise SystemExit(f"grounded job {job.get('id')} needs non-empty input_images")

Type guard

def is_grounded(job: dict) -> bool:
    return job.get("allow_prompt_only_generation") is False

Prevention

When it happens

Trigger: A row job was defined with 'allow_prompt_only_generation': false but no input_images list; input_images was set to [] or omitted; the manifest was edited to remove grounding references.

Common situations: Manually toggling a job to grounded without attaching references; prepare step that should have populated input_images ran against a broken reference set.

Related errors


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