Grazie per aver eseguito quelle query @Don: hai confermato la causa principale
I tuoi risultati mostrano esattamente ciò che sospettavamo
Hai uno schema backup con una copia di user_options
Quella tabella ha ancora il vecchio valore predefinito (column_default = false)
La riga backup è apparsa prima di public nei risultati della query
Quando la migrazione ha rimosso il valore predefinito su public.user_options, non ha toccato backup.user_options. Quindi mark_readonly ha interrogato information_schema.columns senza filtrare per schema, ha ottenuto prima la riga backup (che aveva ancora il valore predefinito) e ha fallito
La soluzione è semplicemente aggiungere table_schema = 'public' alla query in modo che controlli solo lo schema su cui le migrazioni operano effettivamente.