Eslopes
6 de agosto de 2026, 23:51
Resumen de todas las correcciones publicadas en la rama principal desde la versión 1.60.11. Todo está ya disponible en GitHub (main, versión 1.60.35).
Compilación de aplicaciones con formularios y EXEC RUST
El binario compilaba un stub de siete líneas y nada más. Solo sources[0] se convertía en el programa del binario; en un proyecto con formularios eso era el src/main.cbl de la plantilla, así que ningún manejador de eventos se compilaba y todos los botones quedaban muertos. Ahora se compila el .cbl generado del formulario MAIN.
El límite de la columna 72 ha desaparecido. El formato fijo cortaba cada línea en la columna 72 y destruía código en silencio (por ejemplo el Rust incrustado de un EXEC RUST), y rustc señalaba errores en código que el desarrollador nunca escribió. Ahora una línea llega hasta donde se escribió; el área de secuencia (1-6) y la columna indicadora (7) conservan su significado. Contrapartida deliberada: un fuente antiguo con números de secuencia en 73-80 los verá ahora como código.
eframe::run_native en un manejador fallaba en silencio. Una segunda llamada devuelve Err(RecreationAttempt) sin pánico, CATCH RUST-EXCEPTION nunca se disparaba y el "let _ =" descartaba el error. La compilación ahora se detiene con un error en la línea y columna del desarrollador, mostrando el código de reemplazo con cobolt_windows. (1.60.12, 1.60.14, 1.60.16)
Un error del intérprete dejaba la ventana viva pero sorda. El resultado del hilo intérprete se descartaba: la ventana seguía pintándose mientras cada clic se perdía. Ahora se informa por stderr y por el canal DISPLAY, y se avisa de que no se atenderán más eventos. (1.60.12)
Lo que un bloque escribía con cobolt_objects nunca llegaba a la ventana. Ahora se reenvía al terminar el bloque, y los nombres de propiedad se comparan sin distinguir mayúsculas en todos los puntos. (1.60.14)
Recompilar sin tocar nada mostraba un error de EXEC RUST distinto cada vez. El informe ahora es determinista (ordenado por línea y columna del desarrollador) y completo: todos los errores, no solo el primero que cargo mencionara. (1.60.24)
El bug "siempre 2" y la saga del Caption
Leer desde COBOL un ítem OBJECT REFERENCE devolvía su id de handle interno, no su valor. Los handles siguen el orden de declaración, así que el segundo ítem mostraba "2" hiciera lo que hiciera el usuario. DISPLAY, MOVE y SET ...::prop ahora derreferencian el puente: cadenas, enteros, flotantes y booleanos leen el valor real. (1.60.23)
El caption de un manejador ganaba o perdía a cara o cruz contra el de diseño. El registro de objetos guarda las propiedades en mayúsculas y el estado del control conservaba la grafía del diseño, así que convivían "Caption" y "CAPTION" y el orden aleatorio de un HashMap decidía cuál se pintaba: intermitente, sin patrón, estable dentro de un mismo proceso. Ahora una propiedad tiene exactamente una entrada, sea cual sea su grafía. (1.60.33)
Un formulario nuevo era transparente (fondo 00000000) con texto blanco, de modo que la legibilidad dependía de lo que hubiera detrás de la ventana. Un formulario nuevo ahora nace opaco (grafito); los diseños existentes no se tocan. (1.60.29)
La aplicación construida ya puede contar qué está haciendo. Con COBOLT_FRAME_DIAGNOSTICS=1 informa al arrancar qué formulario abrió y sus ids de control, y registra cada actualización de propiedad recibida (o "NO SUCH CONTROL" con los ids que sí existen). El aviso de transparencia añadido en 1.60.32 resultó erróneo y se retiró en 1.60.34. (1.60.32, 1.60.34)
Nuevas pruebas fijan el recorrido completo del caption por ambos extremos, runtime y render. (1.60.28, 1.60.32)
Ejecutar e instalar el programa construido
Ejecutar era "lanzar y olvidar": una muerte era silenciosa. El programa lanzado ahora es un proceso seguido: pid anunciado, stdout/stderr en vivo en el panel Output (stderr marcado), salida informada — discreta si es normal, con código y stderr en un diálogo si falla — y un nuevo Run reemplaza la instancia anterior. (1.60.18)
macOS mataba el programa recién construido en el instante en que Run lo arrancaba. Instalar copiando encima del binario invalida en Apple Silicon la firma de código cacheada del archivo y el proceso muere con SIGKILL sin stderr. La instalación ahora copia a un temporal y renombra de forma atómica (inodo nuevo). (1.60.19)
En Windows la instalación podía fallar con una instancia antigua en ejecución. Windows bloquea el borrado de un .exe en uso pero permite renombrarlo: se aparca el ejecutable en uso, se coloca el nuevo y se limpia después. En Linux, además, se evita el fallo ETXTBSY. (1.60.20)
Una muerte por señal ahora dice qué señal fue, y un SIGKILL justo tras compilar explica su causa habitual. (1.60.19)
Ventanas abiertas desde bloques
Una ventana de bloque que se cerraba a sí misma con send_viewport_cmd(Close) cerraba toda la aplicación, porque el comando alcanza el viewport padre. El cierre soportado es cobolt_windows::close("id"), que termina solo esa ventana; la guía y el System KB lo dicen ahora en cada punto donde el desarrollador encuentra la API, y dos pruebas fijan ambos comportamientos. (1.60.26)
Entrega de la compilación
La compilación entrega en dist/, no en una carpeta con el nombre del proyecto. El destino por defecto era el propio nombre del proyecto, así que el entregable caía en <proyecto>/<proyecto>/ mientras el dist/ creado por la plantilla seguía vacío. Proyectos nuevos, destinos sin fijar y destinos que aún coinciden con el nombre del proyecto entregan ahora en dist/; una carpeta elegida de verdad por el desarrollador se respeta siempre y ningún archivo de proyecto se reescribe. (1.60.27, 1.60.28)
IDE y editor
Cinco arreglos de UX: orden Z de los modales de error, botón Guardar activo solo con cambios sin guardar (y guarda todas las pestañas pendientes), diálogo de compilación como modal real que sobrevive al final y muestra el resultado, bandera de EE. UU. bien dibujada y retirada del botón de auto-corrección. (1.60.13)
El icono Guardar del diseñador era un garabato; ahora es un disquete con la flecha de descarga en una insignia aparte, con una prueba geométrica que impide que vuelvan a cruzarse. (1.60.17)
La ventana de compilación aparece en la ventana desde la que se lanzó la compilación; cada botón de las barras responde con un destello de 75 ms; Run Form queda resaltado mientras compila y ejecuta; el detalle de compilación se revela a 75 ms por línea. (1.60.22)
Tab y Mayús+Tab sangran y quitan sangría a un bloque seleccionado en los tres editores (pestañas de código, COBOL Structure y Event Editor). (1.60.25)
Mayús+Tab repetido hacía que la selección trepara a la línea anterior; ahora cada extremo de la selección queda anclado a su propia línea. (1.60.35)
Un caption con WordWrap se edita en un cuadro de tres líneas en el inspector; sin WordWrap se conserva el cuadro de una línea. (1.60.31)
Mantenimiento
egui/eframe actualizados de 0.35 a 0.36 en el IDE, el motor de formularios, el CLI y las aplicaciones generadas (los bloques EXEC RUST compilan contra eframe 0.36). Verificado con el playbook de actualización: los volcados de esquinas son idénticos byte a byte entre versiones. (1.60.21)
Ejemplo del cambio más visible — leer un ítem enlazado ya devuelve su valor y no el id del handle:
SET Label-1::Caption TO clicked-button
*> antes: el label mostraba "2" (id interno del handle)
*> ahora: muestra el valor que el bloque escribio, p. ej. "7"
Documentación: https://github.com/CloudLandBeta/PowerRustCOBOL/blob/main/docs/developers-guide-en.md
Anthropic Claude Codex Agent
Compilación de aplicaciones con formularios y EXEC RUST
El binario compilaba un stub de siete líneas y nada más. Solo sources[0] se convertía en el programa del binario; en un proyecto con formularios eso era el src/main.cbl de la plantilla, así que ningún manejador de eventos se compilaba y todos los botones quedaban muertos. Ahora se compila el .cbl generado del formulario MAIN.
El límite de la columna 72 ha desaparecido. El formato fijo cortaba cada línea en la columna 72 y destruía código en silencio (por ejemplo el Rust incrustado de un EXEC RUST), y rustc señalaba errores en código que el desarrollador nunca escribió. Ahora una línea llega hasta donde se escribió; el área de secuencia (1-6) y la columna indicadora (7) conservan su significado. Contrapartida deliberada: un fuente antiguo con números de secuencia en 73-80 los verá ahora como código.
eframe::run_native en un manejador fallaba en silencio. Una segunda llamada devuelve Err(RecreationAttempt) sin pánico, CATCH RUST-EXCEPTION nunca se disparaba y el "let _ =" descartaba el error. La compilación ahora se detiene con un error en la línea y columna del desarrollador, mostrando el código de reemplazo con cobolt_windows. (1.60.12, 1.60.14, 1.60.16)
Un error del intérprete dejaba la ventana viva pero sorda. El resultado del hilo intérprete se descartaba: la ventana seguía pintándose mientras cada clic se perdía. Ahora se informa por stderr y por el canal DISPLAY, y se avisa de que no se atenderán más eventos. (1.60.12)
Lo que un bloque escribía con cobolt_objects nunca llegaba a la ventana. Ahora se reenvía al terminar el bloque, y los nombres de propiedad se comparan sin distinguir mayúsculas en todos los puntos. (1.60.14)
Recompilar sin tocar nada mostraba un error de EXEC RUST distinto cada vez. El informe ahora es determinista (ordenado por línea y columna del desarrollador) y completo: todos los errores, no solo el primero que cargo mencionara. (1.60.24)
El bug "siempre 2" y la saga del Caption
Leer desde COBOL un ítem OBJECT REFERENCE devolvía su id de handle interno, no su valor. Los handles siguen el orden de declaración, así que el segundo ítem mostraba "2" hiciera lo que hiciera el usuario. DISPLAY, MOVE y SET ...::prop ahora derreferencian el puente: cadenas, enteros, flotantes y booleanos leen el valor real. (1.60.23)
El caption de un manejador ganaba o perdía a cara o cruz contra el de diseño. El registro de objetos guarda las propiedades en mayúsculas y el estado del control conservaba la grafía del diseño, así que convivían "Caption" y "CAPTION" y el orden aleatorio de un HashMap decidía cuál se pintaba: intermitente, sin patrón, estable dentro de un mismo proceso. Ahora una propiedad tiene exactamente una entrada, sea cual sea su grafía. (1.60.33)
Un formulario nuevo era transparente (fondo 00000000) con texto blanco, de modo que la legibilidad dependía de lo que hubiera detrás de la ventana. Un formulario nuevo ahora nace opaco (grafito); los diseños existentes no se tocan. (1.60.29)
La aplicación construida ya puede contar qué está haciendo. Con COBOLT_FRAME_DIAGNOSTICS=1 informa al arrancar qué formulario abrió y sus ids de control, y registra cada actualización de propiedad recibida (o "NO SUCH CONTROL" con los ids que sí existen). El aviso de transparencia añadido en 1.60.32 resultó erróneo y se retiró en 1.60.34. (1.60.32, 1.60.34)
Nuevas pruebas fijan el recorrido completo del caption por ambos extremos, runtime y render. (1.60.28, 1.60.32)
Ejecutar e instalar el programa construido
Ejecutar era "lanzar y olvidar": una muerte era silenciosa. El programa lanzado ahora es un proceso seguido: pid anunciado, stdout/stderr en vivo en el panel Output (stderr marcado), salida informada — discreta si es normal, con código y stderr en un diálogo si falla — y un nuevo Run reemplaza la instancia anterior. (1.60.18)
macOS mataba el programa recién construido en el instante en que Run lo arrancaba. Instalar copiando encima del binario invalida en Apple Silicon la firma de código cacheada del archivo y el proceso muere con SIGKILL sin stderr. La instalación ahora copia a un temporal y renombra de forma atómica (inodo nuevo). (1.60.19)
En Windows la instalación podía fallar con una instancia antigua en ejecución. Windows bloquea el borrado de un .exe en uso pero permite renombrarlo: se aparca el ejecutable en uso, se coloca el nuevo y se limpia después. En Linux, además, se evita el fallo ETXTBSY. (1.60.20)
Una muerte por señal ahora dice qué señal fue, y un SIGKILL justo tras compilar explica su causa habitual. (1.60.19)
Ventanas abiertas desde bloques
Una ventana de bloque que se cerraba a sí misma con send_viewport_cmd(Close) cerraba toda la aplicación, porque el comando alcanza el viewport padre. El cierre soportado es cobolt_windows::close("id"), que termina solo esa ventana; la guía y el System KB lo dicen ahora en cada punto donde el desarrollador encuentra la API, y dos pruebas fijan ambos comportamientos. (1.60.26)
Entrega de la compilación
La compilación entrega en dist/, no en una carpeta con el nombre del proyecto. El destino por defecto era el propio nombre del proyecto, así que el entregable caía en <proyecto>/<proyecto>/ mientras el dist/ creado por la plantilla seguía vacío. Proyectos nuevos, destinos sin fijar y destinos que aún coinciden con el nombre del proyecto entregan ahora en dist/; una carpeta elegida de verdad por el desarrollador se respeta siempre y ningún archivo de proyecto se reescribe. (1.60.27, 1.60.28)
IDE y editor
Cinco arreglos de UX: orden Z de los modales de error, botón Guardar activo solo con cambios sin guardar (y guarda todas las pestañas pendientes), diálogo de compilación como modal real que sobrevive al final y muestra el resultado, bandera de EE. UU. bien dibujada y retirada del botón de auto-corrección. (1.60.13)
El icono Guardar del diseñador era un garabato; ahora es un disquete con la flecha de descarga en una insignia aparte, con una prueba geométrica que impide que vuelvan a cruzarse. (1.60.17)
La ventana de compilación aparece en la ventana desde la que se lanzó la compilación; cada botón de las barras responde con un destello de 75 ms; Run Form queda resaltado mientras compila y ejecuta; el detalle de compilación se revela a 75 ms por línea. (1.60.22)
Tab y Mayús+Tab sangran y quitan sangría a un bloque seleccionado en los tres editores (pestañas de código, COBOL Structure y Event Editor). (1.60.25)
Mayús+Tab repetido hacía que la selección trepara a la línea anterior; ahora cada extremo de la selección queda anclado a su propia línea. (1.60.35)
Un caption con WordWrap se edita en un cuadro de tres líneas en el inspector; sin WordWrap se conserva el cuadro de una línea. (1.60.31)
Mantenimiento
egui/eframe actualizados de 0.35 a 0.36 en el IDE, el motor de formularios, el CLI y las aplicaciones generadas (los bloques EXEC RUST compilan contra eframe 0.36). Verificado con el playbook de actualización: los volcados de esquinas son idénticos byte a byte entre versiones. (1.60.21)
Ejemplo del cambio más visible — leer un ítem enlazado ya devuelve su valor y no el id del handle:
SET Label-1::Caption TO clicked-button
*> antes: el label mostraba "2" (id interno del handle)
*> ahora: muestra el valor que el bloque escribio, p. ej. "7"
Documentación: https://github.com/CloudLandBeta/PowerRustCOBOL/blob/main/docs/developers-guide-en.md
Anthropic Claude Codex Agent