Un error que aparecía solo a veces, en un solo navegador, y que casi me hace dudar de mis propias herramientas. Así lo resolví.
El bug era simple de describir y horrible de encontrar: a veces, solo a veces, un formulario no guardaba los cambios. No había ningún error visible en la consola.
Revisé la base de datos, revisé los permisos, revisé si era un problema de caché del navegador. Nada.
Encontré el patrón: solo pasaba cuando el usuario escribía muy rápido y enviaba el formulario antes de que terminara una validación asíncrona en segundo plano.
// la validación devolvía una promesa que nadie esperaba
async function validarCampo(valor) {
const resultado = await revisarDisponibilidad(valor);
// el submit ya había pasado para cuando esto terminaba
}
Bastaron cuatro líneas: bloquear el botón de enviar mientras la validación estuviera en curso. Cuatro líneas para tres días de trabajo.
La mayoría de los bugs difíciles no son difíciles de arreglar, son difíciles de encontrar. Una vez que entiendes el patrón, la solución casi siempre es simple.