{"record":{"id":"df543dd33c0a8be5","repo":"affaan-m/ECC","slug":"scene-output-must-use-blend-extension","errorCode":null,"errorMessage":"scene output must use .blend extension","messagePattern":"scene output must use \\.blend extension","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/blender_prop.py","lineNumber":166,"sourceCode":"        return hashlib.file_digest(stream, \"sha256\").hexdigest()\n\n\ndef build(mesh: Path, pack: Path, out: Path | None, frames: int, size: int,\n          render_dir: Path | None, *, width: int | None = None,\n          height: int | None = None, fps: float = 24,\n          receipt: Path | None = None) -> None:\n    width = size if width is None else width\n    height = size if height is None else height\n    validate_settings(frames, width, height, fps)\n    if not mesh.is_file():\n        raise ValueError(f\"mesh is not a regular file: {mesh}\")\n    for path in (out, receipt, render_dir):\n        if path is not None:\n            validate_output(path)\n    if receipt is not None and out is None:\n        raise ValueError(\"receipt requires a saved --out scene\")\n    if out is not None and out.suffix.lower() != \".blend\":\n        raise ValueError(\"scene output must use .blend extension\")\n    if out is not None and receipt is not None and out.absolute() == receipt.absolute():\n        raise ValueError(\"receipt and scene output must be distinct\")\n    source_hash = _sha256(mesh)\n    grade = pack / \"grade.json\"\n    grade_hash = _sha256(grade) if grade.is_file() else None\n    import bpy\n    import mathutils\n\n    bpy.ops.wm.read_factory_settings(use_empty=True)\n\n    suffix = mesh.suffix.lower()\n    if suffix in (\".glb\", \".gltf\"):\n        bpy.ops.import_scene.gltf(filepath=str(mesh))\n    elif suffix == \".obj\":\n        bpy.ops.wm.obj_import(filepath=str(mesh))\n    elif suffix == \".fbx\":\n        bpy.ops.import_scene.fbx(filepath=str(mesh))\n    else:","sourceCodeStart":148,"sourceCodeEnd":184,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/blender_prop.py#L148-L184","documentation":"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.","triggerScenarios":"Thrown at skills/taste-application/scripts/blender_prop.py:166 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Rename the output to end in .blend, e.g. --out scene.blend"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"8321021c54d670126ce3b2969d5deb880b4b0c2a","analyzedAt":"2026-09-16T10:08:13.343Z","contentChangedAt":"2026-09-16T10:08:13.343Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}