The spec says not to send a commitment_signed without any changes, but LND does this. To understand why, you have to understand how LND works. I haven't read the code, but I'm pretty sure it works like this:
lnd slows down to do garbage collection, because it's in Go.
When an alert timer goes off, noticing it's not making process, it sends a twitter message to @Roasbeef. @Roasbeef sshs into the user's machine and binary patches lnd to send a commitment_signed message.
Unfortunately he works so fast that various laws of causality are broken, meaning sometimes the commitment_signed is sent before any of these other things happen.
I'm fairly sure that this will stop as @Roasbeef ages, or lnd introduces some kind of causality enforcement fix.