Inés lleva el soporte de una pequeña empresa que hace software de gestión para clínicas veterinarias. Cansada de la hoja de cálculo compartida, montó en Elffuss Code un tablero de una sola página. Tenía tres columnas, tarjetas que se arrastran y etiquetas de colores: «urgente», «facturación» y «espera cliente». Para que una tarjeta no tuviera la misma etiqueta dos veces, las guardó en un Set. Solo le faltaba el Ctrl+Z.
El deshacer de manual
Le pidió a la IA del editor una pila de deshacer con los últimos 50 estados. La propuesta fue la de siempre: antes de cada cambio, guardar una copia con JSON.parse(JSON.stringify(estado)) y, al deshacer, sacar la última. Inés movió una tarjeta, pulsó Ctrl+Z y la tarjeta volvió a su sitio. Lo dio por bueno.
A la mañana siguiente, un compañero le escribió: «He deshecho un movimiento y la tarea de la clínica de Getafe ha vuelto sin la etiqueta de urgente». No había ningún error en la consola. La tarjeta estaba en su columna, con su título, y sin ninguna etiqueta.
Lo que JSON no sabe guardar
Inés pegó en el chat el código del estado y la descripción del fallo. La IA lo encontró enseguida: JSON.stringify convierte un Set en un objeto vacío. Con new Set(['urgente']) no salta ningún error. Sale «{}» y ya está. Al restaurar, la tarea tenía en etiquetas un objeto normal, sin size. El código que pinta las etiquetas comprobaba primero etiquetas.size > 0. Como undefined no es mayor que cero, no pintaba nada y no se quejaba.
En la prueba de Inés no apareció porque la tarjeta que movió no llevaba etiquetas. El estado en vivo seguía teniendo sus Set intactos. Solo se rompían las copias que salían del historial, y por eso todo parecía funcionar hasta que alguien deshacía algo etiquetado.
La IA también le hizo ver que no era solo cosa de las etiquetas:
- La fecha de vencimiento, un Date, habría vuelto convertida en texto. Ordenar por vencimiento habría pasado a comparar cadenas.
- Los campos con valor undefined desaparecían de la copia sin avisar.
El arreglo fue cambiar la copia por structuredClone(estado), que conserva Set, Map y fechas. A cambio, falla si el estado lleva funciones. El de Inés no llevaba ninguna, así que le venía bien. Además añadió una prueba de tres líneas: crear una tarea con «urgente», moverla, deshacer y comprobar que etiquetas.has('urgente') sigue siendo verdadero.
Por qué en local
Hay que decirlo: el fallo lo escribió la propia IA. JSON.parse(JSON.stringify(...)) está en miles de respuestas y de ahí lo aprende cualquier modelo. Que funcione en local no lo vuelve más listo. Lo que cambió fue cómo encontró el fallo. Para reproducirlo, Inés pegó el tablero tal cual estaba, con los nombres de las clínicas, quién debía facturas y notas como «no llamar antes de las diez, se enfada». En una herramienta que lo manda todo a un servidor, primero habría tenido que inventarse datos falsos, y con datos falsos quizá ni se habría reproducido. Aquí copió, pegó y preguntó, y nada de eso salió del navegador.
Si para depurar tienes que anonimizar los datos, acabas depurando otro programa.
Abre Elffuss Code y depura con tus datos de verdad: la IA corre en tu navegador, sobre tu GPU, y no sube ni el código ni el prompt a ningún sitio.
Abrir Code →