affaan-m/ECC · error · ValueError

scene output must use .blend extension

Error message

scene output must use .blend extension

What it means

build() in blender_prop.py validates the --out scene path extension: Blender's save_as_mainfile needs a .blend target, so any other suffix is rejected.

Solutions

  1. Rename the output to end in .blend, e.g. --out scene.blend
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at skills/taste-application/scripts/blender_prop.py:166 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/df543dd33c0a8be5. Report an issue: GitHub.

Appendix: source

Thrown at skills/taste-application/scripts/blender_prop.py:166

        return hashlib.file_digest(stream, "sha256").hexdigest()


def build(mesh: Path, pack: Path, out: Path | None, frames: int, size: int,
          render_dir: Path | None, *, width: int | None = None,
          height: int | None = None, fps: float = 24,
          receipt: Path | None = None) -> None:
    width = size if width is None else width
    height = size if height is None else height
    validate_settings(frames, width, height, fps)
    if not mesh.is_file():
        raise ValueError(f"mesh is not a regular file: {mesh}")
    for path in (out, receipt, render_dir):
        if path is not None:
            validate_output(path)
    if receipt is not None and out is None:
        raise ValueError("receipt requires a saved --out scene")
    if out is not None and out.suffix.lower() != ".blend":
        raise ValueError("scene output must use .blend extension")
    if out is not None and receipt is not None and out.absolute() == receipt.absolute():
        raise ValueError("receipt and scene output must be distinct")
    source_hash = _sha256(mesh)
    grade = pack / "grade.json"
    grade_hash = _sha256(grade) if grade.is_file() else None
    import bpy
    import mathutils

    bpy.ops.wm.read_factory_settings(use_empty=True)

    suffix = mesh.suffix.lower()
    if suffix in (".glb", ".gltf"):
        bpy.ops.import_scene.gltf(filepath=str(mesh))
    elif suffix == ".obj":
        bpy.ops.wm.obj_import(filepath=str(mesh))
    elif suffix == ".fbx":
        bpy.ops.import_scene.fbx(filepath=str(mesh))
    else:

View on GitHub (pinned to 8321021c54)