Elffuss Elffuss CodeProyecto del día
Proyecto del día · 19 de octubre de 2026

Pulsé deshacer y la tarea volvió, pero sin sus etiquetas

Inés añadió Ctrl+Z a un tablero de soporte con una copia del estado de toda la vida. Funcionó en todas las pruebas hasta que una tarea marcada como «urgente» volvió del historial sin ninguna marca.

El IDE con IA local en el navegadorlocal · en el navegador

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:

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 →
nada de esto se sube a ningún sitio