Injected on every turn while mounted. Shown verbatim — a pack's rules are public by design.
Model at real-world scale: Set the scene unit scale to 1.0 with the metric system (`bpy.context.scene.unit_settings.scale_length = 1.0`) so 1 Blender unit equals 1 meter, and model everything at true dimensions: a 1.7 m character is 1.7 units tall, a 2.0 m doorway is 2.0 units. If an asset comes out the wrong size, fix its dimensions, never its object scale, because unapplied scale poisons every downstream modifier, bake, and engine import.
Quads everywhere that deforms: Any mesh that is skinned or subdivision-bound must be 100% quads in every region that deforms; triangles are acceptable only on flat, non-deforming faces, and n-gons with more than 4 sides never appear anywhere in the mesh. Keep poles (vertices with any edge count other than 4) off joints, eye rims, and mouth rims, and route continuous edge loops around the eyes, around the mouth, and around each limb. Verify by counting face vertex counts in the mesh data: deforming regions must report zero non-quads.
Modifier stack order, and what gets applied before export: Read the stack top to bottom as evaluation order and default to: armature and other deformers first, then mirror, then bevel/boolean, then subdivision surface last. Before export, apply every modifier except armature on a skinned mesh — applying armature destroys skinning — either manually or via the exporter's apply-modifiers option. Never ship a stack whose boolean depends on a cutter object hidden somewhere in the scene.
Normals and shading: Every mesh ships with consistent outward-facing normals: run Make Normals Consistent (`bpy.ops.mesh.normals_make_consistent`) and verify with the viewport Face Orientation overlay, where zero red may be visible. Curved surfaces are shade-smooth, and hard edges in Blender 4.1+ are handled by the Smooth by Angle modifier — 4.1 removed the old Auto Smooth checkbox from mesh data, where the angle setting lived before that. Fix shading errors by correcting normals and edge splits first, not by adding geometry.
UVs and texel density: Every textured mesh gets one unwrap with all islands inside the 0–1 UV space, zero overlapping islands except deliberate mirrored duplicates, and a non-zero island margin. Pick one texel density per asset — defaults: 512 texels per meter for hero assets, 256 for background — and keep every island within ±10% of it. Verify with a checker texture: squares must appear identically sized on every part of the model.
Material and node hygiene: Every material has a meaningful name (not "Material.001"), exactly one Principled BSDF connected to Material Output, and zero unconnected or unused nodes. Before export, delete empty material slots from the mesh and purge unused materials from the file. Image nodes feeding data maps — normal, roughness, metallic — are set to Non-Color, never sRGB. Node input names move between versions — 4.0 renamed Principled BSDF "Specular" to "Specular IOR" — so a script setting inputs by name verifies them against the running build.
Naming and hierarchy: Every object, mesh, material, texture, and bone carries a unique, descriptive name without spaces (use underscores), and the finished file contains zero ".001"-style auto-suffixes — each one is an unnamed duplicate that slipped through. Group related objects into collections by purpose, and name rig bones with Blender's left/right suffix convention (".L"/".R" at the end of the name) so pose mirroring and symmetric tools work.
Origins, transforms, parenting: Each object's origin sits at its logical pivot — base for props, pelvis or center for characters — and before rigging or export every object reads rotation (0,0,0) and scale (1,1,1), applied via Object > Apply > All Transforms (`bpy.ops.object.transform_apply`). Non-uniform or unapplied scale is the leading cause of lopsided bevels, broken bakes, and distorted FBX imports, so treat any scale other than 1.0 as a defect to fix immediately.
Export format: glTF first, FBX when required: Default to glTF 2.0 binary (.glb): it is the open PBR standard, carries materials, shape keys, and vertex colors cleanly, and its Y-up convention is unambiguous. Use FBX only when the destination tool requires it. Whichever format is chosen, lock the exporter settings once per project and reuse them exactly — two export configurations produce two different assets.
Axes and units between Blender and engines: Never assume an export arrived correctly: verify in-engine that the 1.7 m character is 1.7 engine metres tall and facing the right way, first try. Handedness, up-axis and the FBX unit options differ per target — the corpus carries the mapping. An asset 100x too large is a units mismatch, not a modelling error.
Performance budgets: Every asset has a triangle budget and stays inside it; when the project does not state one, use the per-class budgets in the corpus. Texture maps are powers of two only. Clean topology under budget beats noisy detail over it.
What never ships in a .blend: Before delivery, purge orphan data (File > Clean Up, or the outliner purge button) until the orphan count reads zero, then verify: all transforms applied, zero n-gons in deforming regions, no hidden junk objects, no unused images, materials, or packed files. A shipped .blend contains the asset and only the data it uses — every orphan datablock is dead weight that re-breaks on the next import.
bpy scripts must be reproducible: Every script must produce an identical scene when run twice: before creating any object, check by name for the previous run's version and delete or reuse it instead of stacking duplicates. Operate at the data level (bpy.data objects, meshes, materials) wherever possible rather than bpy.ops, because ops depend on selection, active object, and UI context that a script does not control. Never assume scene contents — query, guard, and fail with a clear error.