{"blend_file": "E:\\GDRIVE\\SERVEUR ET PRODUCTION WEB\\2025\\REBIRTH\\BIG EGG\\big-egg-3d\\tools\\dev\\runs\\empty.blend", "code": "SOURCES=[('before', 'E:\\\\GDRIVE\\\\SERVEUR ET PRODUCTION WEB\\\\2025\\\\REBIRTH\\\\BIG EGG\\\\big-egg-3d\\\\tools\\\\dev\\\\runs\\\\brute_original.glb'), ('after', 'E:\\\\GDRIVE\\\\SERVEUR ET PRODUCTION WEB\\\\2025\\\\REBIRTH\\\\BIG EGG\\\\big-egg-3d\\\\assets\\\\models\\\\enemies\\\\barnacle_brute\\\\barnacle_brute.glb')]\nimport bpy, bmesh, collections\nresult = {}\nfor label, path in SOURCES:\n bpy.ops.wm.read_factory_settings(use_empty=True)\n bpy.ops.import_scene.gltf(filepath=path)\n mesh=next(o for o in bpy.context.scene.objects if o.type == 'MESH')\n bm=bmesh.new(); bm.from_mesh(mesh.data); deform=bm.verts.layers.deform.verify()\n def bone(v): return max(v[deform].items(), key=lambda pair:pair[1])[0]\n edge_counts=collections.Counter()\n for face in bm.faces:\n  for loop in face.loops:\n   ends=[(bone(v),*tuple(v.co)) for v in (loop.vert,loop.link_loop_next.vert)]\n   edge_counts[tuple(sorted(ends))] += 1\n stats={'open_edges':sum(n == 1 for n in edge_counts.values()), 'unpaired_edges':sum(n % 2 != 0 for n in edge_counts.values()), 'mixed_bone_faces':sum(len(set(bone(v) for v in f.verts)) > 1 for f in bm.faces)}\n result[label]=stats\n bm.free()\nassert result['before']['open_edges'] > 0\nassert result['after']['open_edges'] == 0\nassert result['after']['unpaired_edges'] == 0\nassert result['after']['mixed_bone_faces'] == 0\n"}