Surface normals; backface culling
Every face has a front and a back. Lighting reads the normal, the GPU culls back-facing triangles. Reverse it and the model looks inside out.
See it
What it is
A normal is the little arrow sticking out of each surface saying 'this way is outside'. Every lighting calculation starts from it: the angle between the normal and the light is what makes one side of a sphere bright and the other dark. Backface culling is the related speed trick, and it does not read your normals at all: the GPU decides whether a triangle faces the camera from the winding order of its projected vertices (clockwise or counter-clockwise on screen) and throws the back-facing ones away before they cost anything to shade. Winding and shading normals are separate data that usually agree, since both fall out of the same modeling, which is why people treat them as one thing. On a closed object you can never see those faces anyway, so it's free performance.
That's also why a flipped normal is so loud. One inverted triangle vanishes and you see straight through the model to whatever is behind it. A whole inverted mesh looks turned inside out, lit from the wrong side, weirdly hollow. Blender's 'Recalculate Outside' and the face orientation overlay fix most of it; a negative scale on one axis (scale.x = -1) silently reverses winding order and causes it in code.
Gotcha: reaching for a double-sided material as the fix is treating the symptom. It doubles the shaded fragments and hands shadows and depth sorting twice as many surfaces to get wrong, which is how a transparent object starts showing its own insides, and it leaves the lighting wrong anyway because the normals are still backwards. Fix the geometry. Legitimate double-sided cases are genuinely flat things: leaves, cloth, paper, single-plane cards.
Ask AI for it
Debug and fix inverted geometry in this three.js scene. Set material.side to FrontSide first so backfaces actually cull and the problem is visible, and add a VertexNormalsHelper to see which way the shading normals point. Then hunt the cause: find transforms with a negative determinant (a negative scale on one axis) and apply or bake them out, since those reverse winding order. For meshes whose triangles are genuinely wound inside out, reverse each triangle's index winding, then recompute shading normals with computeVertexNormals and verify against FrontSide that nothing stayed invisible. Note that computeVertexNormals alone does not repair winding, so do not stop there. Reserve DoubleSide for single-plane geometry like leaves and cloth.