For a while, you could spot an AI-generated image by counting fingers. The model knew a hand had fingers, knew roughly how they clustered, and then lost the plot somewhere around five. So you’d get six, or seven, or a thumb growing out of a knuckle. It was a reliable tell. If the hands were wrong, the image was fake, and you could stop looking.
That tell is mostly gone now. Hands are fine. The models learned hands.
But the images didn’t become correct. The errors just moved somewhere harder to see. Look at a mirror in an AI image and the reflection often shows the wrong side of the face, or a pose that doesn’t match the body casting it. Reflections in glass and water are subtly out of register. Text on a background sign is confident, well-lit, and gibberish. A necklace fuses into the skin. The light comes from two directions at once. The picture is internally plausible everywhere your eye lands first, and wrong everywhere it lands second.
I’ve started thinking of this as the six-finger effect, and I think it describes AI-generated code at least as well as it describes AI-generated art.
Code had six fingers too
Early on, AI code had six fingers everywhere. It called functions that didn’t exist. It imported packages no one had published. It got the argument order backwards, hallucinated a method off the standard library. The failures were structural, the kind a compiler or a quick read catches in seconds. If the code didn’t run, it was fake, and you could stop looking.
Those tells are mostly gone too. The code compiles. It imports things that exist. The function signatures are right, the types line up, the happy path works, and it passes the test you’d have thought to write. The model learned hands.
The errors moved to the mirror
What it didn’t learn is the part you only see on the second look: the reflection in the mirror.
It’s the cache that’s invalidated everywhere except the one path that actually mutates the data. It’s the retry loop that’s correct in isolation but multiplies a downstream rate limit into an outage. It’s error handling that catches the exception and swallows it, so the function returns something plausible instead of failing.
My favorite version is the code whose tests agree with it perfectly, because the test and the implementation encode the same wrong assumption. Both are internally consistent. Both are wrong about the wider system in exactly the same way. That’s the mirror reflecting the wrong side of the face: locally flawless, yet globally impossible.
Local coherence vs global consistency
It’s the same failure for the same reason. These models are extraordinary at local coherence (the next pixel, the next token) and they reach for global consistency only as far as the patterns they’ve absorbed carry them. A hand is a strong, common pattern, so hands got solved. A mirror’s geometry is a constraint that has to hold across the whole image at once, and that’s a harder problem with thinner supervision. So the errors retreat to wherever the constraints are long-range and the reinforcement is sparse.
Code has the same structure. Syntax is local and got solved. The behavior of a whole system under load, the invariant that has to hold across six files, the assumption that’s true in the function and false in production: those are the long-range constraints, and that’s where the sixth finger is hiding now.
Don’t count fingers
None of this is an argument against the tools. I use them constantly; the post you’re reading was shaped with them. It’s an argument about where to spend your attention. The old advice, “just check that it runs,” was calibrated for a world where the errors were structural and loud. They aren’t anymore.
So when I review AI-written code now, I don’t count fingers. I look at the mirrors. I ask what has to be true across the whole change, not just on the line in front of me: the invariant, the edge case, the thing that’s locally perfect and globally wrong. That’s where things goes sideways, if you look hard enough.
And you do have to look hard enough, because the tell didn’t disappear. It just stopped waving at you.