|
Creador de PowerRustCOBOL
|
21.10.2026 06:56
|
|
Posts: 395
|
|
Enviados: 31
|
|
Recibidos: 171
|
|
6. Plan de ejecución — WASM-PLAN (85 elementos)
Documento de orden, crates y riesgos. Cada especificación tiene su propio plan.md y tasks.md, escritos cuando se retome la especificación. No indica el estado por elemento: el estado real está en PROGRESS (sección 7).
Artefactos y responsables (§1):
Módulo de programa — cobolt-wasm (generador y minienlazador), cobolt-wasm-rt (rutinas en Rust para wasm32, distribuidas como un blob), cobolt-decimal (núcleo decimal exacto compartido con el intérprete). Producido por Build del IDE, en segundos, sin cadena de herramientas de Rust (especificaciones 010, 017, 005);
Player — cobolt-web-player (Leptos) y cobolt-graphics; construido una vez por el producto (especificaciones 016, 004, 006, 007, 011, 018);
Página anfitriona y cargador — plantillas de cobolt-compiler (HTML, JS, CSS) (especificaciones 002, 011, 013);
Backend — cobolt-server, nativo (especificaciones 003, 005, 014, 009);
Integración del IDE — cobolt-ide, cobolt-codegen, cobolt-project-tools (especificaciones 001, 008, 015, 012).
Decisiones de ejecución (P1–P8):
P1 — cobolt-wasm-rt es #![no_std], compilado para wasm32-unknown-unknown; rutinas escritas una vez en Rust y enlazadas estáticamente (WASM-010 Q3 (a)); blob versionado en crates/cobolt-wasm/assets/rt.wasm con hash en un archivo adjunto y prueba de actualización; el minienlazador copia solo las funciones alcanzables (tree-shaking), renumera y fusiona los datos estáticos.
P2 — extracción del núcleo decimal a cobolt-decimal (sin std, sin alloc), solo en 2.x.x. Coste declarado: una corrección 1.x.x en value.rs se porta a mano, no mediante cherry-pick.
P3 — el programa se transforma en un grafo de bloques; cada bloque es una función que devuelve el siguiente id o un código reservado (SUSPEND, END, ERROR). Ninguna transferencia de control COBOL utiliza la pila de WebAssembly. Estado de la tarea (pc, pila de PERFORM, pila de CALL) en la memoria lineal. Alternativas rechazadas: función única con loop/br_table, Asyncify y JSPI.
P4 — descriptor por elemento (offset, usage, digits, scale, sign, length); aritmética como secuencia de rt_ld, rt_add, rt_st sobre una pequeña pila de registros en un área temporal que nunca atraviesa una suspensión.
P5 — oráculo: el intérprete, después el estándar; la suite NIST y el estándar deciden cuando discrepan. Cada diferencia se clasifica en WASM-PARITY.md (defecto del generador, defecto del intérprete como corrección 1.x.x, o discrepancia aceptada, con registro del texto del estándar). Harness diferencial cobolt-wasm/tests/parity.rs. El criterio de aprobación es la ejecución NIST.
P6 — flag --conformance del generador, para verbos de archivos secuenciales y line-sequential, solo en el control NIST; esos verbos se convierten en imports file_*; el flag se incluye en el manifiesto; el player y el cargador rechazan los módulos de conformidad; Build de un proyecto web nunca lo activa.
P7 — motores de pruebas: wasmi (Rust puro) para pruebas unitarias y de conformidad; node con V8 para multi-memory fiel al navegador; Chrome y Safari mediante las herramientas de WASM-015 para el player.
P8 — orden: GOLDEN RULE #9 se aplica al generador (NC termina en ambos ejes antes de IF e IC); el resto avanza en paralelo donde los archivos son disjuntos.
Frentes de trabajo (W0–W8):
W0 — documento ABI v1 y este plan (realizado);
W1 — cobolt-graphics: lista de visualización, texto, ImageBuffer, Plot, Scene3D, Physics, handles, límites, control de dependencias (especificación 018; agente G, fusionado);
W2 — CALL … WITH WEBSOCKET LINKAGE, mapeo de grupo ⇄ JSON con vectores de referencia, cobolt-server, contrato y backend de identidad (especificaciones 005, 003, 014, 009; agente B, en curso);
W3 — cobolt-decimal, cobolt-wasm-rt, cobolt-wasm (disposición de datos, transformación, enlazador, código de integración de la API del host), harness de paridad, NC → IF → IC (especificaciones 010, 017; realizado en gran parte);
W4 — player: cobolt-web-player, JS del cargador, página anfitriona, variantes, Viewer mediante construcción de nodos, controles de clases A a E, CSS, navegación, WebLink, control Authentication (lado frontend), controles Canvas conectados a W1 (especificaciones 016, 002, 004, 006, 007, 011, 009, 018; agente P, fusionado en 2.0.24);
W5 — IDE: tipos de proyecto y selector, entradas del árbol, claves Tr, conexión de Build, Run y Preview, vista previa en una vista web (especificaciones 001, 008, 015; fusionado en 2.0.20);
W6 — controles de seguridad y matriz de pruebas, herramientas para agentes, System KB y chunked.data (especificaciones 013, 015; pendiente);
W7 — shell móvil Tauri 2 (especificación 012; pendiente);
W8 — registro de paridad y correcciones portadas a 1.x.x donde el intérprete se equivoca (especificación 010 R16; WASM-PARITY.md; pendiente).
Riesgos (1–7):
El generador es la ruta más larga (NC = 95 programas, 4614 aserciones). Mitigación: primero el harness diferencial, fase A pequeña, registro por fase.
Disposición fiel a los bytes frente a un intérprete basado en valores (REDEFINES, movimientos de grupo sobre COMP-3, MOVE superpuesto). El estándar y NIST son el árbitro.
El minienlazador para un módulo de Rust es infraestructura nueva (puntero de pila global, segmentos de datos, tabla de llamadas indirectas, name section). Mitigación: -C panic=abort, sin alloc, inventario de tree-shaking y wasm-tools validate en cada salida.
Cadena de herramientas: trunk 0.22 requiere rustc 1.96.1 (instalado: 1.95). Utilizar trunk 0.21.14 o wasm-bindgen directamente; nightly fijado para threaded, instalado cuando W4 llegue a ese punto.
lopdf impide que cobolt-forms se compile para wasm32 (código PDF de Viewer). Desactivar PDF en wasm32 mediante una funcionalidad de cargo, algo que W4 realiza y prueba en ambos destinos.
Disco: cada worktree tiene su target/; los agentes clonan con cp -cRp; ningún cargo clean del compartido.
Agentes en paralelo realizando fusiones: cada agente es responsable de crates disjuntos; la integración se realiza mediante merge en features-2x, resolviendo Cargo.toml, Cargo.lock, versión y CHANGELOG a mano.
Definición de terminado de la serie (PLAN §5): cada especificación en V en el registro, con evidencia identificada, y cinco hechos verdaderos, cada uno con una ejecución registrada:
un proyecto web construido mediante Build del IDE se abre en el navegador y en Preview del IDE; los handlers se ejecutan en el módulo generado; el player dibuja los controles;
un CALL remoto llega a un backend autenticado por wss, suspende el módulo y se reanuda con la respuesta;
NC, IF e IC se ejecutan en el módulo generado con 0 fallos;
los players threaded y plain y las dos variantes del módulo superan la matriz de WASM-017 R20;
los shells Android e iOS ejecutan el mismo paquete según la cadena de herramientas de la máquina; lo que no pueda ejecutarse queda en el registro con el comando exacto, “nunca declarado como realizado”.
7. Estado de implementación (WASM-PROGRESS.md, 2026-10-20)
Leyenda del registro: S especificado · P planificado (plan.md) · T con tareas (tasks.md) · I en implementación · V verificado. Una fila solo queda como done cuando sus criterios de aceptación se han ejecutado y superado, con evidencia identificada.
7.1 Estado en el registro: las 18 especificaciones están marcadas solo como S. Las columnas P, T, I y V están vacías. El texto del propio registro documenta un trabajo mucho más avanzado (véase 7.2), por lo que la tabla está desactualizada.
7.2 Ya realizado
NC (NIST Nucleus) en un módulo generado — 2.0.19: compila 95/95 y ejecuta 95/95 con 0 fallos. Módulo: 4612 PASS / 0 FAIL / 5 DELETED; intérprete: 4614 / 0 / 5. La diferencia de 2 se debe al recuento del harness (cuenta los marcadores PASS del archivo de impresión), y la línea de resumen de cada programa es idéntica en los 95. Doce cambios del intérprete aplicados y probados (comparación de números con caracteres, BLANK WHEN ZERO, VALUE en editado, movimiento de grupo alfanumérico editado, desedición con inserciones, INSPECT en numérico con signo, OCCURS DEPENDING ON, nivel 66 y RENAMES, PERFORM VARYING AFTER, WHEN apilados, DIVIDE GIVING editado, claves externas mediante el host).
IF (funciones intrínsecas) en un módulo generado — 2.0.20: 45/45 compilan y se ejecutan; 841 PASS / 0 FAIL.
IC (programas anidados y llamadas) — 2.0.22: 25/25 compilan y se ejecutan; 309 PASS / 0 FAIL / 4 DELETED. Cubre unidades de programa, CALL/CANCEL, LINKAGE, GLOBAL/EXTERNAL, archivos OPTIONAL y declarativas USE.
cobolt-decimal — V. Suite del intérprete: 1527 superadas, 0 fallidas.
cobolt-numedit — V. 199.233 casos aleatorios, 0 diferencias frente al original.
cobolt-wasm-rt — I. 15 pruebas nativas (códecs, MOVE, aritmética, condiciones, DISPLAY, pictures editadas, INSPECT, STRING, UNSTRING, INITIALIZE, archivos de conformidad).
cobolt-wasm (generador), fases A y B de WASM-010 — I. Programas iguales al intérprete, byte a byte, en ambas variantes de memoria. Los módulos se validan. “Hello” tiene 15,8 KB.
Player, cargador, página anfitriona y paquete — fusionados en 2.0.24 (7 commits). Verificados en Chrome y node frente a un módulo fixture, no frente a un módulo generado.
ABI A5 a A7 — vinculan al generador: los exports de formulario en compile_project se escriben conforme a ellas (PROG-43, vinculante).
IDE: tipos de proyecto, selector, árbol, Preview y herramientas — fusionados en 2.0.20.
cobolt-graphics, parte 1 (el crate) — fusionado en 2.0.21. Según el plan: 330 pruebas superadas en macOS; compila para wasm32 en 20 de 20 combinaciones de funcionalidades.
CALL … RETURNING local — corrección 8a15f00d (1.91.219) en main, portada como afe22c51 (2.0.1) en 2.x.x.
7.3 Pendiente
|