# Simplot: diferencias funcionales y plan de ampliación

Fecha de revisión: 2026-10-08. Complementa [REVISION-GRAFICADORES.md](REVISION-GRAFICADORES.md). Se comparan funciones, no similitudes de nombre. Este documento es un plan: no anuncia como implementadas las capacidades pendientes.

## Decisión: el cálculo general pertenece a Tabular2

Por indicación del autor (2026-10-08), **todo procesamiento numérico general se incorporará a Tabular2 y Simplot lo consumirá para dibujar**. El catálogo de funciones típicas, existentes y pendientes, queda en [Tabular2: procesamiento numérico](../../tabular2/doc/PLAN-PROCESAMIENTO-NUMERICO.md), que es la referencia del trabajo numérico. Las etapas E4, E5 y E6 de esta matriz son necesidades de integración, no algoritmos a implementar dentro de Simplot.

Esto incluye filtros/ordenamiento, expresiones entre columnas, alineación/interpolación, estadística, histogramas, ventanas, derivadas, integrales, ajustes y FFT. Tabular2 ya implementa parte de estas familias: primero se reutilizará o expondrá lo existente. Simplot conserva series, ejes, leyendas, paneles, estilos y formatos; dibujar barras de error o bandas dadas no equivale a calcular sus incertidumbres. La selección y conversiones históricas de Simplot se mantienen hasta poder delegarlas con pruebas de equivalencia.

## Alcance y evidencia

| Referencia | Qué se comprobó | Límite de la comparación |
|---|---|---|
| Simplot actual | Lector slex/DAT, órdenes aceptadas, motor Perl/Gnuplot y corpus | Una posibilidad de Gnuplot no equivale a una función accesible desde PARAPLOT |
| Plot histórico | Fuentes completas archivadas en `viejos/plot`; comparación de lectores y motor | No se encontró un motor adicional que aporte por sí solo estas ampliaciones; no reactivar las copias antiguas |
| SD2 nuevo | `sceptre2novender/SC1-SD2-26131/sd2`, pruebas de expresiones y bloques | Referencia de comportamiento; no hacerlo dependencia de Simplot |
| Observable Plot | Documentación oficial consultada, que identifica versión 0.6.17 | No se instaló ni se ejecutó; funciones documentadas, no una evaluación de rendimiento |
| Plot2 | Sitio y manual oficial, que se declara para 2.6.11 | No se ejecutó la aplicación macOS; no está establecida una licencia para reutilizar sus fuentes |
| Gnuplot local | Versión 6.0 patchlevel 0 | El paquete admite versiones anteriores; cada ampliación debe verificar su versión y terminales mínimos |

Fuentes locales para las decisiones: `lib/SimPlot/Dato.pm::ordenes` y `slex/d2datdinc/dato.c` delimitan el vocabulario público; `PlotGNU.pm::guardar_renglones`, `pun_lin`, `funciones`, `grafear` e `inicio` delimitan lo dibujado; `seleccionar_filas` implementa el filtro; `ParaPlot.pm::inventar_graficos` agrupa pedidos; `TablaSimple.pm` y `ArchSimulV.pm::campossimul` inspeccionan tablas. El contrato actual se describe en [DAT-PARAPLOT.md](DAT-PARAPLOT.md).

## Matriz funcional

En la columna Simplot, **existe** significa accesible por el lenguaje o interfaz actual; **parcial** indica un límite concreto; **falta** significa que no hay una interfaz de Simplot para esa capacidad, aunque Gnuplot pueda hacerla. Las referencias de la segunda columna dan evidencia positiva: una referencia omitida no significa que el otro programa carezca de la función.

| Capacidad | Referencia positiva | Simplot actual | Trabajo necesario / etapa |
|---|---|---|---|
| Líneas, puntos y funciones analíticas | Plot, SD2, [Observable: marcas](https://observablehq.github.io/plot/features/marks), [Plot2](https://apps.micw.org/apps/plot2/) | Existe; se pueden superponer | Conservar corpus y compatibilidad, E0 |
| Paneles y superposiciones | Plot; [facetas de Observable](https://observablehq.github.io/plot/features/facets); subviews de Plot2 | Parcial: `mostrarjuntos`, no facetas por categoría | Distribución de paneles, escalas compartidas y agrupación explícita, E3/E5 |
| Rangos, títulos, unidades y leyendas | Los cuatro referentes | Existe, con configuración limitada | Separar etiquetas, unidades y estilo; preservar conversiones, E2/E3 |
| Estilos, tamaño/color según datos | [Observable: marcas](https://observablehq.github.io/plot/features/marks), [Plot2: atributos](https://plotdoc.micw.org/Doc/AttributeInspector) | Parcial: líneas/puntos y estilos del motor | Propiedades y columnas de estilo tipadas, E3 |
| Barras, escalones, impulsos, áreas | Observable (barras/áreas), Plot2 (barras/áreas/sticks) | Falta | Nuevos tipos de serie; backend existente, E3 |
| Errores X/Y y bandas entre cotas | Plot2 (errores); Observable (composición de áreas y reglas) | Barras X/Y implementadas con límites absolutos dados; bandas pendientes | PARAPLOT/DAT con limites_x/limites_y; deltas no implementados, E3 |
| Escalas logarítmicas e invertidas | [Observable: escalas](https://observablehq.github.io/plot/features/scales), Plot2 | Existe en DAT v2; se rechazan ceros/negativos | Agregar sintaxis DS y ampliar corpus, E3 |
| Ejes temporales de calendario | Observable y Plot2 | Parcial: DAT v2 muestra epoch en zona local/UTC con marcas básicas | Ajuste de densidad/meses/años y pruebas de cambios horarios, E2/E3 |
| Ejes secundarios | Plot2 | Falta | Identidad de eje por serie y unidades independientes; no asignar automáticamente, E3 |
| PDF y SVG seleccionables | Plot2 documenta PDF; Observable genera SVG | Existe en DAT v2, además de PNG/EPS | Ampliar configuración y prueba instalada, E3 |
| Etiquetas, anotaciones, leyendas configurables | Observable y Plot2 | Parcial: títulos y leyendas automáticas | Texto escapado, posición/unidad de coordenadas, estilo y visibilidad, E3 |
| Filtro y ordenamiento | [Observable: transformaciones](https://observablehq.github.io/plot/features/transforms), Plot2 | Parcial: `selec` por intervalo | Dependencias entre filtros, orden estable y expresiones restringidas, E0/E4 |
| Columnas calculadas | SD2 (`$2*2`), Observable, Plot2 | Parcial: `funcion` es analítica, no álgebra general de columnas | Expresiones tipadas con referencias validadas y errores de dominio, E4 |
| Reruns en bloques de una misma tabla | SD2 | V2 selecciona bloque por índice con Tabular2; v1 conserva `arch_var` | Selector por nombre y corpus de muchas corridas desiguales, E2 |
| Operaciones entre corridas o tablas | SD2 rechaza mezclas incompatibles; Plot2 ofrece operaciones entre buffers | Falta un contrato explícito | Rechazar desalineación por defecto; unión/interpolación solo declaradas, E4 |
| Agrupar, contar, sumar, promediar | [Observable: transformaciones](https://observablehq.github.io/plot/features/transforms) | Falta; agrupar dibujos por magnitud no agrega datos | Transformaciones numéricas independientes del dibujante, E5 |
| Histogramas y distribuciones acumuladas | [Observable: bin](https://observablehq.github.io/plot/transforms/bin); Plot2 documenta histogramas | Falta | Calcular intervalos/frecuencias antes de dibujar barras; límites y normalización explícitos, E5 |
| Ventanas móviles, normalización y acumulación | [Observable: window](https://observablehq.github.io/plot/transforms/window), normalización; Plot2 | Falta | Definir bordes, ventana por muestras/tiempo y valores faltantes, E5 |
| Cajas, densidad y mapas de calor | Observable: box, density, cell/raster | Falta | Estadística y datos 2D tipados; no confundir color por punto con mapa raster, E5/E7 |
| Interpolación y suavizado | Plot2 | Falta como operación reproducible | Distinguir interpolación de datos y suavizado visual; evaluar tabular2, E6 |
| Derivación e integración de tablas | Plot2 | Falta | Métodos, unidades, abscisas irregulares y tolerancias comprobadas, E6 |
| Ajustes y residuos | [Observable: regresión lineal](https://observablehq.github.io/plot/marks/linear-regression), Plot2 | Falta | Modelo, pesos, convergencia, residuos y salida numérica, E6 |
| FFT y espectros | Plot2 | Falta | Muestreo, ventana, normalización, unidades y backend numérico, E6 |
| Texto/categorías, CSV e importadores | Observable admite datos estructurados; [Plot2: importación](https://plotdoc.micw.org/Doc/Import) | V2 delega a Tabular2; CSV numérico probado; no texto/categorías | Completar formatos en Tabular2 y probar integración, E2/E7 |
| Datos faltantes y discontinuidades | Observable documenta cortes de líneas | Parcial/no uniforme entre lectores | Marcador y política por operación; no unir segmentos silenciosamente, E2 |
| Inspección con cursor y selección visual | [Observable: interacción](https://observablehq.github.io/plot/features/interactions), Plot2 | Parcial: preguntas por terminal; X11 delegado | Backend interactivo opcional, nunca requisito de ejecución por lotes, E7 |
| Editor de datos, importación SQL y macros generales | Plot2 | Falta | Prioridad baja; mantener fuera del núcleo y evaluar necesidad, E7 |
| Geografía, árboles, triangulación y vectores | Observable: geo/tree/Delaunay/vector | Falta | Extensiones separadas; no justifican cambiar ahora el modelo de series 2D, E7 |

La página de [marcas de Observable](https://observablehq.github.io/plot/features/marks) permite identificar familias ausentes, no garantizar equivalencia entre sus algoritmos y los de Gnuplot. La [documentación oficial de Gnuplot](https://www.gnuplot.info/docs/) ofrece primitivas que pueden usarse sin cambiar de backend: [barras de error](https://www.gnuplot.info/docs_6.0/loc6695.html), [relleno entre curvas](https://www.gnuplot.info/docs_6.0/loc5351.html), estilos, escalas y terminales. Hay que comprobar lo que esté disponible en cada instalación; no basta con aceptar la palabra en el parser.

## PARAPLOT único: completar la migración y ampliar el lenguaje

Decisión del 09/10/2026: v1 y v2 no serán dos lenguajes entre los cuales deba elegir el usuario. Se desarrollará un solo PARAPLOT, conservando las prestaciones históricas, incorporando todas las del modelo v2 y las ideas gráficas pertinentes de Observable Plot. Las versiones del DAT siguen siendo necesarias para leer documentos anteriores. Esta sección fija el trabajo a realizar; no afirma que la migración esté terminada.

### Requisitos del lenguaje mejorado

RESULTADOS es la sintaxis ultrasimple de PARAPLOT, no otro lenguaje ni una función independiente. La lista elemental es su forma mínima; los atributos opcionales enriquecen el pedido; las órdenes explícitas permiten elegir fuentes, coordenadas y composición. Todas las formas deben normalizarse al mismo modelo gráfico. La ampliación conservará los nombres históricos de las secciones y sus reglas de combinación: simplicidad conceptual no autoriza a cambiar silenciosamente precedencias.

Pruebas de aceptación: pares de RESULTADOS y pedidos explícitos equivalentes con los mismos metadatos; comprobar fuente predeterminada, abscisa, orden, agrupación, leyendas, unidades y estilos, además de un solo estado. Cubrir también reemplazo y adición de secciones y metadatos ausentes. No comparar solamente la cantidad de imágenes. Documentar los valores predeterminados para que la forma abreviada sea comprensible y predecible.

| Objetivo | Regla de diseño y verificación |
|---|---|
| Fácil de entender | Pedidos habituales breves, nombres coherentes y opciones con nombre; ejemplos completos de menor a mayor complejidad. No exigir JSON ni instrucciones Gnuplot para una capacidad pública |
| Potente y expresivo | Componer series, capas, estilos, escalas y paneles sin multiplicar órdenes especiales para cada combinación; distinguir datos, pedido y presentación |
| Compatible con PARAPLOT viejo | Aceptar los documentos válidos existentes sin reescribirlos ni exigir que el usuario elija un motor. Conservar el significado de órdenes, argumentos y valores predeterminados históricos; las formas nuevas no reinterpretan las antiguas |
| Una implementación | Normalizar las formas antiguas y las nuevas al mismo modelo interno. La compatibilidad vive en la entrada, no en mantener indefinidamente dos motores de dibujo |
| Errores comprensibles | Indicar archivo/línea cuando exista, orden, argumento y causa; no omitir instrucciones ni sustituir silenciosamente una prestación que falte |

Cada simplificación de sintaxis tendrá un ejemplo antiguo y otro nuevo equivalentes en el corpus. No se reemplazarán los originales por la forma nueva para hacer pasar las pruebas. Los formatos o entradas históricas inválidos y las construcciones inseguras detectadas se registrarán por separado con diagnóstico explícito; no se prometerá reproducir fallos ni ejecutar código arbitrario. Cualquier incompatibilidad real quedará identificada antes de declarar terminada la migración.

| Orden | Trabajo | Criterio de cierre |
|---|---|---|
| U1 — inventario y corpus | Enumerar todas las órdenes y variantes del lector y del motor histórico, no solo las presentes en el corpus. Registrar significado, resultado, dependencias y equivalente tipado. Incluir variables, magnitudes, selec, arch_var, funcion, nomostrar, guardar, plantillas y .tvar | Cada prestación tiene caso mínimo, caso combinado y casos negativos; comparar valores, series, unidades, paneles y política de salida, no imágenes píxel a píxel |
| U2 — compatibilidad | Traducir el PARAPLOT histórico y adaptar el DAT v1 al modelo común; ampliar el modelo donde falte información. Mantener nombres, orden de capas, referencias adelantadas, reruns y significado de las órdenes | Un mismo pedido histórico produce el resultado equivalente por el recorrido común; no descartar órdenes ni cambiar de motor silenciosamente |
| U3 — toda v2 desde PARAPLOT | Añadir sintaxis .ds para bloques, escalas lineales/logarítmicas/temporales, inversión, formato de salida y disposición de paneles. Conservar barras de error, RESULTADOS, unidades y espacio coordenado | Toda capacidad pública del DAT v2 tiene una forma PARAPLOT documentada; pares .ds/DAT equivalentes y prueba de entrada por pipe |
| U4 — vocabulario de dibujo | Capas de líneas, puntos, barras, escalones, impulsos, bandas entre cotas, segmentos, reglas y textos; estilos tipados y control de leyendas. Priorizar bandas y estilos tras cerrar compatibilidad | Datos y cotas suministrados por el productor, sin cálculos estadísticos; comprobar columnas enviadas a Gnuplot, unidades y superposición |
| U5 — composición | Color, tamaño y símbolo asociados a columnas; escalas y leyendas explícitas; paneles por categorías con escalas compartidas o independientes declaradas | No alterar los valores de entrada; esperar soporte de categorías/texto en Tabular2 cuando se necesite; probar categorías vacías, orden y unidades incompatibles |
| U6 — un motor | Derivar entradas históricas y nuevas al mismo validador/renderizador. Retirar la implementación histórica activa solo después de completar la matriz | Corpus histórico y nuevo, ejecución instalada, DAT autónomo, .ds, stdin, un solo punto, reentrancia y errores pasan por el recorrido común |

Las familias de U4 y U5 se inspiran en [marcas y composición de Observable Plot](https://observablehq.github.io/plot/features/marks) y [facetas](https://observablehq.github.io/plot/features/facets), no en copiar su API JavaScript. Se conservará la sintaxis declarativa propia de PARAPLOT. Las capas se superponen en un gráfico; las facetas repiten gráficos según categorías: son operaciones distintas.

Límite de responsabilidad: no incorporar a Simplot histogramado, medias, regresión, suavizado, densidad ni otros cálculos de Observable. Tabular2 u otro productor entregan sus resultados; PARAPLOT describe cómo dibujarlos. Las prestaciones históricas selec y funcion también requieren una solución compatible a través del componente numérico, con gramática segura y errores explícitos; no copiar eval de Perl ni aceptar código Gnuplot arbitrario como solución de migración.

Antes de implementar cada bloque: definir campos del modelo y sintaxis, fijar casos de corpus, modificar slex y Simplot coordinadamente, comitear el cambio y verificarlo. Las correcciones se comitean también. No cambiar el valor por defecto de SIMPLOT_VERSION ni eliminar el recorrido histórico hasta cumplir U6. No se exige instalar Observable, D3 ni un navegador.

## Recorrido y responsabilidades

    DS/PARAPLOT → slex → DAT versionado
                           ↓
                     validar referencias
                           ↓
                Tabular2: tablas / bloques / calculos
                           ↓
                   series / ejes / paneles
                           ↓
                    backend Gnuplot

| Capa | Responsabilidad | Restricción |
|---|---|---|
| Lector slex | Sintaxis, includes, ubicación del error y objetos del DAT | Una sola gramática compartida con Siru; no agregar otro parser DS en Perl |
| Adaptador v1 | Convertir el contrato histórico al modelo interno | No cambiar el sentido de órdenes existentes ni reinterpretar silenciosamente v1 |
| Tablas/bloques — Tabular2 | Datos, tipos de columnas, unidades, faltantes y procedencia; Simplot adapta las referencias del DAT | Original inmutable; identificar cada corrida y conservar precisión |
| Transformaciones — Tabular2 | Grafo acíclico numérico, cálculos, resultados derivados y diagnósticos; Simplot solicita y consume | Resolver por dependencias, no por orden alfabético; memoria y costo controlados; sin algoritmos duplicados en Perl |
| Series/ejes/paneles | Qué se dibuja y cómo se distribuye | Separar error medido de intervalo calculado; escala no es transformación de datos |
| Backend | Órdenes y archivos de Gnuplot | Sin código Perl del documento; validar/escapar cadenas y comprobar capacidades |

Seguridad: hoy `PlotGNU.pm::rango` usa `eval` de texto y las funciones llegan al intérprete de Gnuplot. Los documentos actuales son entradas confiables, no un sandbox. Antes de exponer fórmulas nuevas, definir una gramática de operadores/funciones permitidos y retirar esas evaluaciones de texto; rechazar órdenes, sustituciones de shell y acceso a archivos dentro de expresiones. No basta con reemplazar `eval` por envío directo a Gnuplot.

## Etapas, cambios y criterios de aceptación

| Etapa | Implementación prevista | Pruebas de aceptación |
|---|---|---|
| E0 — base estable | Resolver cabeceras comentadas/agrupamiento; impedir cierre global de ventanas; ordenar selecciones por dependencia y detectar ciclos | Corpus histórico intacto; misma semántica de cabecera; entrada preservada; cadenas invertidas y ciclos; ningún `killall` involuntario |
| E1 — contrato y seguridad | Modelo interno separado del generador Gnuplot, esquema tipado v2 y adaptador v1; validación de expresiones/rutas | DS y DAT producen la misma representación; DAT funciona sin DS; versiones desconocidas fallan; cadenas maliciosas no se ejecutan |
| E2 — fuentes y bloques | Integrar los lectores, bloques, fechas y unidades de Tabular2; completar allí lo faltante y adaptar las referencias gráficas | 12 corridas desiguales, nombres largos, rutas con espacios, double sin pérdida, tiempo local/UTC, cero mezcla de bloques |
| E3 — ampliar dibujo | Errores/bandas, estilos, logaritmos, ejes secundarios, formatos y paneles | Datos sintéticos de cotas conocidas; firmas PDF/SVG/PNG; diagnóstico de terminal ausente; prueba de leyendas y unidades |
| E4 — consumir álgebra y filtros | Tabular2 implementa/reutiliza referencias de columnas, selección compuesta y operaciones alineadas; Simplot integra la interfaz | Resultado numérico conocido, división por cero, referencias inválidas, ciclos, alineación explícita y originales intactos |
| E5 — dibujar resúmenes | Tabular2 calcula bins, agregaciones, normalización, ventanas y distribuciones; Simplot representa los resultados y organiza facetas | Pruebas numéricas en Tabular2; correspondencia entre resultados, series y paneles en Simplot |
| E6 — consumir cálculo científico | Tabular2 resuelve derivada, integral, interpolación, regresión y FFT; Simplot representa sus resultados y diagnósticos | Referencias numéricas en Tabular2; pruebas de integración y dibujo en Simplot, sin reimplementar algoritmos |
| E7 — extensiones | Categorías/CSV avanzados, interacción, anotaciones complejas y tipos especializados | Propuestas separadas según casos reales; núcleo sin navegador, SQL ni SCEPTRE obligatorios |
| Publicación incremental | README, ChangeLog, corpus y paquetes de Simplot/lector juntos cuando cambie el contrato | Prueba instalada en directorio limpio, sin rutas al árbol; soporte de la versión mínima y dependencias verificadas |

Las etapas no autorizan a marcar toda una familia como disponible al implementar un solo caso. Para cada funcionalidad: especificación → caso numérico y negativo → implementación → commit inmediato → pruebas → documentación del resultado → paquete cuando corresponda. Si las pruebas fallan, corregir y comitear el arreglo; no ocultar regresiones como TODO.

## Primeros entregables y archivos

1. E0: `scripts/simplot.pl`, `lib/SimPlot/TablaSimple.pm`, `ArchSimulV.pm`, `ParaPlot.pm`, `PlotGNU.pm`; nuevas regresiones en `tests/` y datos mínimos en `corpus/`.
2. E1: especificación del DAT en `doc/DAT-PARAPLOT.md`; módulos nuevos de modelo/validación en `lib/SimPlot/`; cambios coordinados en `slex/d2datdinc/dato.[ch]`, tabla slex y pruebas. Revisar cambios ajenos antes de tocar el lector compartido.
3. E3 inicial, tras E1: barras de error Y simétricas/asimétricas, bandas entre columnas y escalas logarítmicas. Es una primera ampliación útil del dibujo; no requiere traer otra aplicación ni implementar FFT.
4. E2/E4: coordinar con Tabular2 bloques y expresiones de SD2 antes de operaciones entre archivos. No interpolar corridas automáticamente como hacen algunas herramientas; pedir política explícita. La interfaz Perl–Tabular2 se definirá tras revisar API/CLI; no se incorpora ahora SWIG ni otra dependencia.

Estado al escribir el plan: comparación documental realizada; capacidades nuevas de E1–E7 pendientes. El corpus previo pasó 132 pruebas; eso no demuestra ninguna capacidad nueva de esta matriz. No se descargó código de Observable/Plot2 ni se cambiaron los sitios web.

## Avance de E0

| Trabajo | Estado comprobado |
|---|---|
| Cierre global de ventanas | Corregido en r2639: sin killall al iniciar; -nokill compatible, -kill rechazado con estado 2 |
| Materialización de filtros encadenados | Corregida en r2640: orden por dependencias, no alfabético; corpus/filtros comprueba los valores intermedios y finales |
| Ciclos y padres inexistentes | Rechazados antes de crear recortes o dibujos; pruebas negativas incorporadas |
| Cabeceras comentadas y agrupamiento sin magnitudes | Corregidos en r2647; mismo lector para T A B y # T A B; RESULTADOS explícito agrupa sin magnitudes/unidades, respetando metadatos heredados; generación automática conservada |
| Regresión conjunta | 10 archivos, 152 pruebas, PASS; incluye escenarios históricos y nuevos casos de cabeceras |

## Avance de E1

Modelo definido en [DAT-SIMPLOT-V2.md](DAT-SIMPLOT-V2.md), validador puro en `lib/SimPlot/Modelo.pm` y renderizador en `lib/SimPlot/Render.pm`. Ya está activo: `SIMPLOT_VERSION=2` selecciona el productor slex; la consola reconoce DAT v2. Siru conserva el objeto sin cambios en su código ni en sus ecuaciones. Se traduce un subconjunto explícito de PARAPLOT; órdenes no implementadas producen error. V1 sigue por su motor y pasa su corpus histórico.

El renderizador usa `interpola --exportar-simul`, valida columnas/bloques/unidades y dibuja líneas/puntos, escalas lineal/log/temporal, inversión, paneles y PNG/EPS/PDF/SVG. Esto adelanta partes de E2/E3, no completa esas etapas. El cálculo general sigue en Tabular2 y T0 sigue pendiente. Los casos concretos de E0 pasaron; eso no certifica toda variante histórica. Observable y Plot2 siguen siendo comparaciones documentales, no ensayos de uso/rendimiento.

| Próximo trabajo | Alcance pendiente |
|---|---|
| Compatibilidad v2 | RESULTADOS/UNIDADES y ANADIR_GRAFICOS ya operativos; pendientes varias plantillas, traducción .tvar y restantes órdenes históricas; no migrarlas silenciosamente |
| Tabular2 T0 | Exponer interpolación, inversa, media, RMS, integral y remuestreo; sin repetir algoritmos en Simplot |
| Fuentes y unidades | Conversión de presentación implementada mediante Tabular2/libunidades, con tempC/tempF; pendiente selector por nombre de bloque |
| Dibujo | Bandas/estilos/ejes secundarios; órdenes .ds para opciones exclusivas del DAT. Barras de error X/Y con límites dados ya operativas |
| Distribución y publicación | -3 publicado como inestable el 09/10/2026, DEB construido/probado en Ubuntu 22.04 y cinco artefactos descargados/comparados. Pendiente publicar dependencias mínimas slex/Tabular2 y probar instalación completa desde el servidor antes de promover. Véase PAQUETES.md |

## Cierre histórico de RESULTADOS/UNIDADES y paquetes -2 (9 de octubre de 2026)

- RESULTADOS/UNIDADES: regresión completa de 359 pruebas de Simplot; conversiones delegadas a Tabular2/libunidades.
- OUTPUTS sin PARAPLOT: `d2datdinc --graficos` crea el modelo optativo, sin alterar el DAT de cálculo. Si no existe la tabla, Simplot indica su ruta.
- Espacio coordenado: `--pares` y el objeto DAT `pares` producen proyecciones de las columnas elegidas, con paneles paginados. Un solo estado sigue siendo un solo punto por proyección: no se inventa tiempo, trayectoria ni superficie solución del sistema.
- Distribución: slex 1.0-25, Tabular2 2.0-16 y Simplot 2017.0.2.R1017-2; 14 comprobaciones adicionales desde los paquetes instalados, sin fuentes montadas. RPM/TGZ generados, no ensayados como instalación nativa en otras distribuciones.

## Avance posterior: contexto, limpieza y documentación (9 de octubre de 2026)

| Área | Estado actual |
|---|---|
| Reentrancia | API `SimPlot::Contexto` con herramientas y destinos por instancia; motor v2 probado con llamadas anidadas y concurrentes. Motor histórico aislado por proceso, pendiente migrar sus globales internas. Véase [REENTRANCIA.md](REENTRANCIA.md). |
| Limpieza | Módulos sin uso archivados en `viejos/`; rutinas históricas desconectadas comentadas en los módulos activos. |
| Documentación | Documentos de `share/doc/simplot/es` trasladados a `doc/historico/`, con originales conservados; contenido útil integrado en [GUIA-USO.md](GUIA-USO.md) y ejemplo ejecutable verificado. |
| Regresión de esta etapa | 19 archivos, 506 comprobaciones PASS; incluye 44 de reentrancia, 36 de limpieza histórica, 37 de instalación temporal y 30 documentales. No reemplaza los resultados de etapas anteriores. |
| Paquetes | Manifiesto y entrada Debian -3 actualizados; paquetes actuales todavía por reconstruir. El DEB -3 temporal de la etapa del instalador no contiene estas ampliaciones. |

Este avance no completa las funcionalidades gráficas ni Tabular2 T0 pendientes en la tabla anterior.

## Avance posterior: desinstalación y distribución verificable

`make uninstall` respeta PREFIX/DESTDIR y usa un manifiesto de archivos/huellas y directorios creados. Conserva modificados y ajenos; no adivina qué borrar de instalaciones antiguas sin registro. `make distcheck` verifica el tar de fuentes, pruebas, ejecución instalada y desinstalación sin restos en prefijo directo y staging. Resultado: `make check` pasa 542 comprobaciones en 20 archivos; `distcheck` PASS, con las dos comparaciones que necesitan Siru vecino omitidas en la copia aislada. Sigue pendiente reconstruir los paquetes actuales; no hubo instalación en el sistema ni publicación.
