|
Creador de PowerRustCOBOL
|
21.10.2026 06:56
|
|
Posts: 395
|
|
Enviados: 31
|
|
Recibidos: 171
|
|
Cuestiones:
Q1 — Rasterizador — decidido (reconsiderable): tiny-skia en CPU. Alternativa: vello (GPU) cuando sea estable.
Q2 — Capa de escena — decidido: propia sobre wgpu.
Q3 — Animación esquelética y sombras — decidido (están en R9).
Q4 — Renderizador desktop — abierto: eframe tiene glow y wgpu; compartir el dispositivo con Canvas3D exige wgpu. (El texto de la especificación llama a esto “Q7” en R16 y “Q4” en §7; registro ambas referencias tal como están).
Q5 — Adaptador de software para CI — abierto: para que las referencias 3D se ejecuten sin GPU.
Q6 — Nombres — decidido: ImageBuffer y Plot (evitando los controles Image y Chart).
Q7 — Fuentes — abierto: cuáles se incorporan al conjunto base para CJK y RTL, y si se cargan bajo demanda.
Q8 — Audio — abierto, fuera de esta especificación: un objeto de sonido sobre kira sería una especificación separada.
Plan (plan.md y tasks.md): tareas T1–T22.
Parte 1 (el crate), realizada: T1 base (lista de visualización v1, rasterizador, límites, handles); T2 motor de texto; T3 ImageBuffer; T4 Plot; T5 Physics2D/3D; T6 Scene3D y Canvas3D; T7 API orientada a COBOL, registro y handles con propietario; T8 control de dependencias; T9 mediciones y comprobaciones de tamaño; T10 plan y tareas.
Parte 2 (hosts), no iniciada: T11 adaptador del host egui; T12 bindings del intérprete (objetos como controles, vocabulario en methods.rs, RETURNING para handles); T13 generador y módulo generado (lista de visualización en la arena, una llamada al host); T14 partes del player (cargar motor 3D, gráficos y filtros en el primer uso).
Parte 3 (superficie del producto), no iniciada: T15 controles Canvas2D y Canvas3D (propiedades, eventos, .cfrm, Properties, caja de herramientas, tests/controls/); T16 marcador de posición del Designer; T17 System KB y chunked.data; T18 etiquetas en seis idiomas; T19 gamepad (gilrs y Gamepad API); T20 examples/PowerGraphics; T21 verificación en navegador y entre plataformas; T22 documentación y finalización.
Discrepancias registradas en el plan (respecto de la especificación): harfrust 0.12 en lugar de rustybuzz (archivado en upstream); icu_segmenter en lugar de unicode-linebreak (último release de 2023); tiny-skia 0.12 en lugar de 0.11.4 (el gradiente cónico de dos puntos es el de createRadialGradient); plotters con backends propios y motor de texto propio en lugar de ab_glyph; glam 0.33; gltf 1.4.1 sin la funcionalidad de lectura de archivos; naga solo como dev-dependency; hilos de rapier limitados a 256.
Pendientes del plan: no se ha verificado la regla de antigüedad del release de R4 (fechas no disponibles sin conexión). Las referencias de GPU difieren entre adaptadores (solo se ejecutó Metal).
Criterios de aceptación (AC1–AC14): AC1 (dibujo idéntico píxel a píxel en los tres destinos, texto en los seis idiomas); AC2 (diez mil formas en una sola llamada al host); AC3 (MeasureText igual a la extensión de DrawText en texto latino, japonés, chino y RTL); AC4 (glTF animado con luces, sombras y pick); AC5 (Backend informa de WebGPU, WebGL2 o ninguno); AC6 (mismas posiciones con 1 o N hilos y en plain frente a threaded); AC7 (desenfoque de 24 MP más rápido en threaded, medido); AC8 (una tabla COBOL de 100.000 valores se convierte en una serie en una pasada); AC9 (abrir y cerrar 100 veces un formulario con canvas, imagen y escena vuelve a la línea de base); AC11 (control de dependencias, plan T8); AC10, AC12 y AC13 no se describen en el resumen de lectura, véase la especificación; AC14 (el ejemplo web carga el motor 3D solo cuando aparece el formulario 3D).
4. Especificaciones propuestas, todavía sin archivo (WASM-019 a WASM-035)
Fuente: WASM-INDEX §5. “P2” se necesita inmediatamente después o junto con la serie; “P3” es posterior. Los números son provisionales. Ninguna tiene un archivo de especificación.
Propuesta Especificación Por qué falta actualmente P
WASM-019 Despliegue y operación del backend Contenedores, nube (PowerCloud ya conoce AWS), proxy inverso y TLS, escalado y afinidad de sesión, secretos, métricas y trazas (ampliando el documento de observabilidad), estado, actualizaciones graduales, migraciones y copias de seguridad P2
WASM-020 Accesibilidad e internacionalización de las aplicaciones generadas ARIA, orden del foco, contraste, RTL, formatos de configuración regional frente a PICTURE editado y DECIMAL-POINT IS COMMA, IME, UTF-8 en PIC X/PIC N y JSON, cambio de idioma durante la ejecución P2
WASM-021 Modelo de interacción táctil y móvil Gestos, pulsación prolongada como menú contextual, sin hover, comprobación de tamaño mínimo del objetivo táctil, comportamiento del teclado virtual, modos de entrada según PICTURE (teclado numérico), orientación, pull-to-refresh P2
WASM-022 Funcionamiento sin conexión, PWA y caché Service worker, cola de llamadas sin conexión, política de IndexedDB, flujo de actualización del paquete e invalidación de caché, posibilidad de instalación P2
WASM-023 Controles de datos posteriores a la v1 Paginación, ordenación y filtrado en el servidor para DataGrid; control optimista en Save; transacciones entre llamadas (COMMIT/ROLLBACK por el canal); bloqueo de registros con clientes remotos (depende de la corrección del bloqueo entre procesos) P2
WASM-024 Depuración y diagnóstico Puntos de interrupción COBOL durante la ejecución en el navegador (el crate DAP sobre WebSocket hasta el IDE), mapas de código fuente más allá de line table, telemetría de consola y errores, informes de fallos, identificadores de correlación entre los logs del frontend y del backend P2
WASM-025 Distribución y actualizaciones Alojamiento y CDN, cabeceras de caché, URL versionadas, actualizador de Tauri, listas de comprobación para el envío a las tiendas, qué hace update_check del IDE cuando existe 2.0.0 (lo ofrecería a todos los IDE 1.x.x), reversión P2
WASM-026 Conversión de proyectos y código compartido Asistente de conversión desktop → web que señala los controles y verbos no compatibles, pasos de project_upgrade, Common Code y copybooks compartidos entre desktop y web P2
WASM-027 Plantillas y ejemplos Plantilla Agentic AI Chatbot (Web) (la clave del modelo reside en el backend), UserControl (Web), versiones web de PowerChat, PowerAnalytics, PowerDemo3 y PowerSpatial, Create from Template… P2
WASM-028 Documentación, localización y plan de lanzamiento Capítulos del Developer’s Guide 2.0 (retenidos por la decisión de 2026-10-19), README, regeneración de las cinco traducciones en la versión menor, anuncios en el foro agrupados en el RC, pasos de release candidate a partir de 2.0.0 P2
WASM-029 Presupuestos de rendimiento Cifras que WASM-017 hace medibles: tamaño y arranque del módulo, rendimiento del módulo frente al intérprete (cobolt-bench), virtualización de DataGrid, memoria, tamaño de payloads P2
WASM-030 Licencias y cumplimiento Licencias de Leptos, Tauri, crate de vista web, emisor y empaquetador; políticas de uso de teselas de mapas; términos y consentimiento de reCAPTCHA; formularios de seguridad de los datos de las tiendas; leyes de protección de datos P2
WASM-031 Funcionalidades adicionales de identidad Inicio de sesión social y federación, passkeys/WebAuthn, modelo de autorización (roles y permisos), gestión de sesiones y dispositivos, log de auditoría P3
WASM-032 Plugins, controles personalizados y crates externos en wasm32 Custom { plugin_id } sin painter ni runtime; EXEC RUST rechazado en el navegador (WASM-002 Q4) y necesita una vía mediante el backend P3
WASM-033 Más controles nativos de la web Vídeo y audio integrados, imagen desde URL, IFrame, editor de texto enriquecido, cámara y lector de QR (móvil) P3
WASM-034 Otros factores de forma Smartwatch Android, Apple Watch, TV P3
WASM-035 Evolución del diseñador Diseñador basado en una vista web, diseñador que entiende CSS, marcos de dispositivo, vista previa del estado de componentes P3
Carencias estratégicas que señala el propio índice (afectan a todas las especificaciones):
El principio de “un renderizador para todo” (especificación 017) termina en la web: Form Designer dibuja con egui y la web con DOM. La paridad de píxeles es un objetivo medido (WASM-004 R11), y el operador decide cuánta diferencia es aceptable (WASM-004 Q6, WASM-007 Q5).
Un lenguaje, dos motores: el navegador ejecuta WebAssembly generado; el backend y desktop ejecutan el intérprete. Mantener ambos iguales es un criterio de aprobación medido (WASM-010 R16, WASM-015 R6).
El generador es la ruta crítica: la fase A de WASM-010 debe existir antes de la mayoría de los criterios de aceptación de las demás especificaciones.
Claves en formularios: AgentAPIKey y ConnectionString aceptan texto. Los ejemplos de 2026-10-19 dejan las claves vacías, y el control de análisis de secretos (WASM-002 R7, WASM-013 R7) es lo que lo garantiza.
5. Contrato de bajo nivel — WASM-ABI-v1 (152 elementos)
Estado: borrador 1, modificado el 2026-10-20. Es normativo para cobolt-wasm (productor), cobolt-web-player y el cargador de la página anfitriona (consumidores). Modificar el archivo implica modificar los tres. El campo abi del manifiesto aumenta cuando una regla cambia de forma incompatible. Actualmente abi: 1.
Convenciones (ABI-03 a ABI-06): enteros little-endian; varint es LEB128 sin signo, hasta 5 bytes; text es varint length seguido de bytes UTF-8; los offsets son bytes dentro de la arena.
Artefactos (§1):
program.wasm — variante multi-memory; memoria 0 = datos COBOL, memoria 1 = arena (ABI-07);
program.single.wasm — variante single-memory; la arena es una región de la memoria 0; sin instrucciones multi-memory (ABI-08);
player.wasm, player.js — construidos por el producto; plain y threaded (ABI-09);
manifest.json — también incrustado como custom section prmanifest (ABI-10);
formularios, hoja de estilos y recursos (ABI-11);
regla de imports: solo los de §3 (ABI-12); regla de exports: solo los de §4, además de las memorias y los pr_dbg_* opcionales (ABI-13).
Memoria (§2):
Memoria de datos 0 con tamaño fijo, mínimo y máximo iguales (ABI-14); sin memory.grow (ABI-15);
disposición: [constants][descriptors][form templates][instance regions: Instances × size per form][task stacks][scratch registers] (ABI-16);
arena: arena_size bytes, procedente del límite de payload (ABI-17, 1 MiB de forma predeterminada);
región batch (offset 0, 64 KiB de forma predeterminada, escrita por el módulo) (ABI-18);
región answer (offset batch_size, 64 KiB de forma predeterminada, escrita por el host) (ABI-19);
región frame-out (escrita por el módulo, una solicitud remota) (ABI-20) y frame-in (escrita por el host, una respuesta) (ABI-21);
en multi-memory, la arena es la memoria 1, con offsets absolutos (ABI-22); en single, una región de la memoria 0 a partir de pr_arena_base() (ABI-23);
el host determina la variante mediante pr_variant() y el export arena, nunca por suposición (ABI-24);
el host obtiene una vista de la memoria en cada uso y no la conserva entre llamadas (ABI-25).
Imports (§3), namespace "pr":
flush(len) — aplica los comandos de batch en orden; se llama al finalizar, al suspenderse, al ceder, cuando batch se llena y antes de cada query (ABI-27);
query(len) -> i32 — batch con comandos y una query; el host aplica, evalúa, escribe la respuesta en answer y devuelve el tamaño o un error negativo (ABI-28);
remote(len) -> i32 — envía frame-out y devuelve un request id (≥ 0) o un error; la tarea retorna entonces SUSPENDED (ABI-29);
now() -> f64 (ms desde la época Unix, UTC) (ABI-30); random() -> f64 en [0, 1) (ABI-31);
abort(len) — fatal, con comando ERROR; el host notifica, termina la tarea y mantiene la aplicación; no retorna (ABI-32);
imports exclusivos de conformidad: file_open, file_read, file_write, file_close (ABI-33, detalles en §8);
un host que no proporciona un import declarado se niega a iniciar, con el mensaje de WASM-002 R15 (ABI-34).
Exports (§4):
memory y arena (ABI-35); pr_abi() -> i32 (valor 1, ABI-36); pr_variant() -> i32 (bit 0 = multi-memory, bit 1 = conformance) (ABI-37); pr_arena_base() -> i32 (ABI-38); pr_init() -> i32 (se ejecuta una vez; 0 = ok) (ABI-39);
pr_open_form(form, opener) -> i32 — crea una instancia, devuelve el id de instancia o un error (-3 = sin instancia libre, error de WASM-017 R2 con el nombre del formulario) (ABI-40);
pr_close_form(inst) -> i32 — handlers de cierre, libera y reinicializa la región cuando la tarea está DONE (ABI-41);
pr_event(inst, ctrl, event, argc) -> i32 — ejecuta el handler vinculado a (ctrl, event) con argc textos leídos de answer (ABI-42);
pr_resume(task, len) -> i32 — continúa la tarea después de SUSPENDED o YIELDED (ABI-43);
pr_cancel(task) — abandona la tarea suspendida (ABI-44);
pr_tick() -> i32 — tarea actual o -1 (ABI-45);
pr_status() -> i32 — estado de la ejecución más reciente (ABI-46);
pr_dbg_live() y pr_dbg_region_used() — opcionales, para la prueba de liberación (ABI-47, ABI-48);
estados: 0 DONE (ABI-49), 1 SUSPENDED (ABI-50), 2 YIELDED (ABI-51), 3 STOPPED — STOP RUN o GOBACK del programa principal (ABI-52); negativo = error (ABI-53);
regla “uno a la vez” (ABI-54), sustituida por la enmienda A5.
Batch, módulo → host (§5):
op 0x01 SET (path, text) — asigna un valor a una propiedad o miembro (ABI-55);
op 0x02 CALL (path) — invoca un método y descarta el resultado (ABI-56);
op 0x03 DISPLAY (text) — consola del host (ABI-57);
op 0x04 ERROR (varint code, text message, varint unit, varint line, varint form, varint event) — error con posición COBOL (ABI-58);
op 0x05 LOG (varint level, text) — diagnóstico (ABI-59);
gramática de path: varint inst, varint ctrl, varint nseg, seg*, donde seg es varint name, varint nargs, text* (ABI-60);
ids de control: 0 = el propio formulario (ABI-61); 1 = el formulario que abrió este, super:: (ABI-62); 2 = el objeto de la aplicación, COBOL:: (ABI-63); controles numerados a partir de 3, en el orden de forms[i].controls (ABI-64);
tabla names del manifiesto, compartida por el módulo (ABI-65).
Queries, módulo → host, síncronas (§6):
la región batch termina con una query, op en 0x10…0x1F (ABI-66);
0x10 GET (path), 0x11 CALLR (path), 0x12 COUNT (path) (ABI-67, ABI-68, ABI-69);
el host aplica los comandos antes de la query para que la lectura refleje las escrituras del propio handler (ABI-70);
el código generado no emite una query por iteración de bucle, salvo que haya una lectura de control en el bucle (ABI-71).
Eventos, host → módulo (§7):
pr_event identifica el control y el evento por su índice en la tabla events del manifiesto, con los nombres de desktop (ABI-72);
argc textos al comienzo de answer (ABI-73);
los eventos sin handler no se entregan: el manifiesto enumera los pares con handler (ABI-74).
Conformidad (§8), solo hosts de prueba:
file_open(name_len, mode) con modo 0 input, 1 output, 2 extend, 3 input/output (ABI-75); file_read(handle, cap), -1 = fin de archivo (ABI-76); file_write(handle, len) (ABI-77); file_close(handle) (ABI-78); bit 1 de pr_variant activado (ABI-79);
el cargador rechaza un módulo de conformidad en una página, en el shell Tauri y en Preview (ABI-80).
Códigos de error (§9): -1 genérico (ABI-81); -2 argumento inválido (ABI-82); -3 sin instancia libre (ABI-83); -4 formulario, control, evento o verbo desconocido (ABI-84); -5 payload demasiado grande para la arena (ABI-85); -6 el host rechazó por permiso o política (ABI-86); -7 sin conexión o fallo de transporte (ABI-87); -8 cancelado (ABI-88); -9 tiempo de espera agotado (ABI-89); -10 el módulo produjo un trap (ABI-90). Un error de ejecución COBOL no es un trap: llega como ERROR y estado negativo (ABI-91). Un trap es un defecto del generador y se convierte en -10 con la última línea conocida, mediante la global $line (ABI-92).
Manifiesto (§10, JSON en prmanifest): campos abi (ABI-93), generator (ABI-94), project (ABI-95), variant con multi_memory y conformance (ABI-96), limits con arena_size 1048576, batch_size 65536, answer_size 65536, frame_size 393216, budget_blocks 20000 y data_pages 17 (ABI-97), names (ABI-98), events (ABI-99), forms con {id, name, main, instances, region_size, controls[{id,name,type}], handlers[{ctrl,event,entry}]} (ABI-100), builtins (ABI-101), imports (ABI-102), sizes con module, rt_functions y rt_bytes (ABI-103). Custom sections prmanifest (ABI-104) y prlines, que vincula un line id con unidad, línea y columna (ABI-105). Global $line exportada para diagnóstico (ABI-106). Name section con form.paragraph.block (ABI-107).
Lista de comprobación del host (§11): ABI-108 (streaming, comprobación de variante, verificación de pr_abi); ABI-109 (imports exactos, manifiesto, pr_init, pr_open_form del formulario principal); ABI-110 (aplicar batch en orden, nunca retener una vista, encolar eventos, reanudar después de YIELDED); ABI-111 (pr_close_form al destruir y liberar referencias); ABI-112 (UTF-8 en ambas direcciones, una conversión por dirección).
Enmiendas de 2026-10-20 (§12), cada una es una regla que la implementación demostró incompleta:
A1 — pr_status enumerado como export (ABI-114). Afecta al generador: sí.
A2 — pr_close_form devuelve el estado; la región se libera cuando está DONE (ABI-115). Afecta al generador solo si el handler de cierre se suspende.
A3 — exports opcionales pr_dbg_* para la prueba de liberación (ABI-116). No afecta al generador.
A4 — ERROR.code es la magnitud (3 para -3) o un número COBOL a partir de 1000 (ABI-117). Afecta: sí.
A5 — varias tareas suspendidas al mismo tiempo, una por instancia de formulario; las tareas de distintas instancias se intercalan (un OpenFormSync suspende al que abre mientras se ejecuta el hijo); los eventos de una misma instancia permanecen en serie; pr_resume(task, len) identifica la tarea; pr_cancel(-1) descarta la ejecución que produjo un trap (ABI-118). Afecta: sí, tabla de tareas y estado por tarea. El fixture tiene 4 tareas: el que abre, el hijo modal y dos reservas.
A6 — frame de error para una llamada remota que falla: {"id":N,"error":{"class","code","message","may_hav e_been_received"}}, con clases transport, authentication, limit y client. Una llamada enviada cuando cayó el enlace tiene may_have_been_received: true y nunca se repite. Frame de éxito: {"id":N,"result":…} (ABI-119). Afecta: sí.
A7 — verbos de COBOL:: y me:: que implementa el player, cuáles se suspenden y el texto de argumento de cada evento (ABI-120). Un verbo desconocido responde -4 y un ERROR. Afecta: sí.
A8 — sobre de mensajes en la conexión entre player y backend (ABI-121): primer mensaje {"type":"auth","token":…}; llamada {"type":"call","id":N,"frame":{…}}; respuesta {"id":N,"result":…} o {"id":N,"error":{…}}; ping y pong; un error de autenticación con expired hace renovar el token y repetir una vez. Los ids inferiores a 0x80000000 son del módulo; los superiores, del player (control Authentication). Es una propuesta del player hasta que WASM-014 la sustituya. No afecta al generador; el backend debe utilizar este formato.
Verbos COBOL:: (objeto de la aplicación, ctrl 2) — §12.1:
MessageBox, Alert (texto, título, botones; se suspende hasta cerrar; botón en DialogResult) (ABI-122);
Confirm (como el anterior, con botones de pregunta; se suspende) (ABI-123);
InputBox (texto, título, valor predeterminado; texto introducido en DialogResult; se suspende) (ABI-124);
Sleep, Wait (milisegundos; se suspende) (ABI-125);
OpenFormSync, OpenFormAsync (nombre del formulario; handle; Sync se suspende hasta que se cierra el hijo) (ABI-126);
Navigate, OpenUrl (dirección y destino, según la política de WebLink; no se suspende) (ABI-127);
Download (nombre y texto; no se suspende) (ABI-128); CopyToClipboard (ABI-129); SetTitle (ABI-130);
GetProperty, SetProperty (propiedades de la aplicación: DialogResult, Locale, Standalone, Title…) (ABI-131);
StopRun, Exit (la aplicación termina; STOPPED) (ABI-132).
Verbos me:: (formulario, ctrl 0) — §12.1:
OpenFormSync, OpenFormAsync — solo Sync se suspende (ABI-133);
Close — cierra después de que termina el handler (ABI-134);
SetTitle, SetFullscreen, SetFocus, GetFormState… (la lista termina en puntos suspensivos, no es exhaustiva) (ABI-135).
Authentication (ctrl del control) — §12.1: SignOut, Refresh, GetClaim (valor de una claim, nunca el token) (ABI-136).
Argumento de cada evento — §12.2 (todos los argumentos son text):
teclado (onKeyDown, onKeyPress, onKeyUp): la tecla (ABI-137);
onMouseWheel: delta vertical (ABI-138); onCheckedChanged: true o false (ABI-139); onItemChecked: elementos marcados separados por salto de línea (ABI-140); onItemDoubleClick: texto del elemento (ABI-141); onTabClick y onTabChanged: número de página, a partir de 1 (ABI-142);
onNodeClick, onNodeSelect, onNodeDblClick, onNodeCheck: text⇥index⇥level⇥checked (ABI-143);
onMenuClick, onMenuItemClick: id del elemento (ABI-144); onClick de un botón de ToolBar: id; de WebLink: modificadores (ABI-145);
onCellClick, onCellDoubleClick: row,column a partir de 0 (ABI-146); onRowDoubleClick: fila; onColumnClick: columna (a partir de 0);
onMapClick: latitud y longitud con seis decimales (ABI-147); onMarkerClick: id del marcador (ABI-148);
onFilesDropped, onFilesRejected: nombres separados por salto de línea (ABI-149);
onButtonClick de Snackbar: id del botón (ABI-150);
onSignedIn, onSignedOut, onSignUpCompleted, onPasswordResetRequested, onMfaRequired: sin argumento (ABI-151);
onError de Authentication: clase y código de la respuesta del backend, nunca el mensaje (ABI-152).
|