Elffuss CodeProyecto del día
Proyecto del día · 16 de septiembre de 2026

«¿Se puede deshacer?»: Ctrl+Z iba letra a letra, y al arreglarlo se tragó medio formulario

Un constructor de formularios interno, una petición que parecía de veinte minutos y una pila de deshacer que agrupaba por reloj cuando tenía que agrupar por intención.

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

La herramienta es un constructor de formularios interno: bloques que se añaden, se renombran, se marcan como obligatorios y se borran. Lleva meses funcionando sin quejas y un día llega la petición de siempre, dicha como si fuera trivial: «¿se puede deshacer?».

La primera versión sale enseguida: cada cambio en el estado empuja una copia a una pila y Ctrl+Z saca la última. Funciona. Y es insufrible. Renombrar un campo a «Importe base imponible» son veintitantas entradas en la pila, así que deshacer ese cambio es apretar Ctrl+Z hasta que te cansas y te vas a arreglarlo a mano.

Agrupar por reloj es lo primero que se te ocurre, y está mal

El arreglo obvio: si dos cambios llegan seguidos, que cuenten como uno. Y ahí empieza lo bueno. Escribes el nombre de un campo, lo marcas obligatorio y borras el de abajo, todo del tirón; un Ctrl+Z y desaparecen las tres cosas. Quien lo usa quería recuperar el campo borrado, no viajar a un pasado anterior.

La regla que sí aguanta no mira el reloj, mira la intención:

Con eso resuelto aparece el segundo bug, más sutil: deshacer un borrado devolvía el campo al final de la lista. La operación inversa tiene que llevarse el índice consigo, no solo el objeto. Y detrás viene el tercero: si deshaces tres pasos y después escribes, hay que cortar la rama de rehacer, o te quedas con un futuro que ya no existe y que el usuario puede invocar.

Pegar el estado de verdad, no una maqueta

Aquí es donde la cosa se pone incómoda con una IA en la nube. Para que te ayuden con esto hay que enseñar el estado real: la forma del modelo entera, con los nombres de campo del cliente, los comentarios internos y las tres excepciones que nadie documentó. Y de paso el prompt describe una herramienta que todavía no ha salido de la empresa. Lo normal es autocensurarse, montar un ejemplo de juguete con foo y bar, y recibir una respuesta impecable que no encaja con tu reducer.

Con el modelo corriendo dentro del navegador, sobre tu propia GPU, ese cálculo desaparece: pegas el tipo tal cual, con sus nombres feos, y preguntas. Ni el código ni el prompt salen de tu equipo, así que no hay nada que maquillar antes de pedir ayuda.

La IA no decidió el criterio de agrupación: eso lo pones tú, porque conoces a quien usa la herramienta. Lo que hizo fue escribir el reducer, el inverso de cada acción y una lista de secuencias con las que intentar romperlo.

Media tarde. Y la pila de deshacer ya no se traga nada que no le hayas pedido.

Si tienes a mano un reducer que te da miedo enseñar por ahí, ábrelo en Elffuss Code: el modelo corre en tu navegador, así que puedes pegarle el estado entero sin que salga nada de tu equipo.

Abrir Code →
nada de esto se sube a ningún sitio