OK, ¿si simplifico esto a:
select * from plugin_store_rows WHERE plugin_name = 'discourse-data-explorer' AND type_name = 'JSON' AND (replace(key, 'q:',''))::integer < 0;
Eso devuelve dos filas idénticas (salvo por ‘id’).
Supongo que debería ser valiente y borrar una.
PD: Hecho, eliminé el registro más nuevo - reconstruyendo
(Usé DELETE from plugin_store_rows WHERE id = $$$el_id_de_la_fila_duplicada$$$;)
¡LA MIGRACIÓN FUNCIONÓ!
Gracias por el impulso @Falco