{"record":{"id":"66c493cbd96114d4","repo":"affaan-m/ECC","slug":"mesh-is-not-a-regular-file-mesh","errorCode":null,"errorMessage":"mesh is not a regular file: {mesh}","messagePattern":"mesh is not a regular file: (.+?)","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"skills/taste-application/scripts/blender_prop.py","lineNumber":159,"sourceCode":"    expected = [render_dir / f\"turn_{frame:04d}.png\" for frame in range(1, frames + 1)]\n    if \"FINISHED\" not in status or not all(path.is_file() and path.stat().st_size > 0 for path in expected):\n        raise RuntimeError(\"Blender did not complete every requested render frame\")\n\n\ndef _sha256(path: Path) -> str:\n    with path.open(\"rb\") as stream:\n        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()","sourceCodeStart":141,"sourceCodeEnd":177,"githubUrl":"https://github.com/affaan-m/ECC/blob/8321021c54d670126ce3b2969d5deb880b4b0c2a/skills/taste-application/scripts/blender_prop.py#L141-L177","documentation":"build() in blender_prop.py checks that the --mesh argument refers to an existing regular file before importing; the path is missing, a directory, or a special file.","triggerScenarios":"Thrown at skills/taste-application/scripts/blender_prop.py:159 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Check the mesh path for typos","Ensure the path is a regular file (not a directory or symlink to a missing target)"],"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"}