The migration that dropped the table it meant to rename.
The migration ran clean in staging. Staging had 12 rows. Prod had 2.3 million.
The generated migration dropped-and-recreated instead of altering in place. In staging the data loss was invisible. In prod it was the customer table. The backup was 26 hours old.
The lesson isn’t ‘review migrations.’ It’s: staging that doesn’t share prod’s shape tests nothing. The agent didn’t know that. The human was supposed to.