# Auditoría y plan de limpieza del repositorio LL-Dominus

Fecha de inventario: 2026-08-11  
Raíz auditada: `C:\xampp\htdocs\LL-Dominus`  
Alcance: inspección de árbol real, referencias de código, scripts de build, Git y tamaños.  
Regla aplicada: no se ha borrado, movido, renombrado ni modificado código o configuración. Este informe es el único fichero creado.

## Resumen ejecutivo

- El diseñador web real entra por `public/index.php`. Para conservar su comportamiento actual necesita `public/`, dos almacenes hermanos (`lbl/` y `lst/`) y, si se usa la conversión LL12 de la API/Xailer, `tools/ll12_import/import_lst.php`.
- `node_modules/` no es necesario en el VPS. El navegador usa `public/vendor/pell/` y CDNs; Node se usa para Playwright y herramientas.
- El engine Harbour definitivo está en `tools/harbour/engine/`. Renderers y exportadores están en `tools/harbour/renderers/` y `tools/harbour/exporters/`.
- La única biblioteca final del engine encontrada es `tools/harbour/lib/liblldominus.a`, 1.430 MiB, Windows PE/i386 (32 bits). Es un artefacto ignorado por Git. No existe build Linux ni una biblioteca Linux en el repo.
- La integración Xailer está en `tools/harbour/xailer/`. El build busca la salida final en `C:\local\xailer9\Proyectos\LLDominus\lib\libXaLLDominus.a`, pero ese fichero no existe al auditar. Tampoco existe en el repo `TFormLLPreview.xfm`, aunque `TFormLLPreview.prg` lo incluye.
- `tests/ia/results/` ocupa 932,51 MiB: 7.121 archivos en 388 carpetas de ejecución. Hay al menos 2.556 archivos redundantes por SHA-256, equivalentes a 306,51 MiB.
- El mayor artefacto individual fuera de `lst-antiguos/` es `tools/ll12_compat/output/compatibility.json`, con 238,34 MiB; es regenerable e ignorado.
- Git está limpio. Sin embargo, siguen trackeados 186 ficheros bajo `node_modules/`, `test-results/.last-run.json`, `TRenderTPrinter.o`, el archivo de biblioteca temporal `tools/harbour/stP1kAlM` y numerosas salidas de importación/auditoría.
- Hay una incompatibilidad actual con el objetivo «VPS sin tests»: el endpoint IA escribe incidencias y reparaciones en `tests/ia/work/manual-designer`. Debe parametrizarse o moverse conceptualmente a `var/ia/` antes de excluir por completo `tests/` manteniendo esa telemetría.

## 1. Inventario del root

Los tamaños son físicos aproximados y pueden variar levemente por redondeo.

| Carpeta | Finalidad real | Clase | Tamaño / archivos | VPS | Compilar engine | Xailer | Excluir de distribuciones no relacionadas |
|---|---|---|---:|:---:|:---:|:---:|:---:|
| `.agents/` | Vacía; metadatos potenciales de agentes | desarrollo | 0 | NO | NO | NO | SÍ |
| `.git/` | Base de datos e historial Git | VCS/desarrollo | 31,57 MiB / 53 | NO | NO | NO | SÍ |
| `cliente/` | Cliente/runtime PHP de referencia (`TLLDominusPHP`) y demo | fuente PHP + demo | 0,05 MiB / 3 | NO para diseñador | NO | NO | SÍ, salvo SDK PHP específico |
| `docs/` | Arquitectura, lenguaje, manuales LL12 y referencias IA | documentación | 5,10 MiB / 21 | NO | NO | NO | SÍ del runtime; conservar en repositorio |
| `json/` | Placeholder vacío | placeholder | 1 archivo | NO | NO | NO | SÍ |
| `lbl/` | 19 plantillas Dominus `.lbl` y 10 datos demo JSON | plantillas/samples | 4,16 MiB / 30 | SÍ, al menos directorio writable; contenido selectivo | NO | NO para compilar; plantillas sí en uso | Según paquete |
| `lst/` | Placeholder/almacén de plantillas `.lst`; actualmente vacío | runtime storage | 1 archivo | SÍ como directorio writable si se guarda `.lst` | NO | NO | Contenido selectivo |
| `lst-antiguos/` | Corpus histórico LL12, backups y recursos | histórico/fixtures | 150,01 MiB / 875 | NO | NO | NO | SÍ; archivar fuera del repo activo |
| `node_modules/` | Dependencias Node para Playwright, ZXing, PNG y Pell de npm | desarrollo/test | 36,27 MiB / 2.599 | NO | NO | NO | SÍ |
| `pdf/` | Placeholder vacío | placeholder de salida | 1 archivo | NO | NO | NO | SÍ |
| `public/` | Diseñador, endpoints PHP, IA, motor PHP/HTML y assets | runtime web + tests/herramientas mezclados | 20,72 MiB / 335 | SÍ, de forma selectiva | NO para Harbour | API web usada por Xailer | No del paquete web |
| `samples/` | Placeholder vacío | samples | 1 archivo | NO | NO | NO | SÍ |
| `servidor/` | Fachada PHP `TPreviewPHP` para el cliente PHP | fuente servidor PHP | 0,01 MiB / 1 | NO para el diseñador actual | NO | NO | SÍ, salvo SDK PHP |
| `test-results/` | Estado de última ejecución Playwright | test output | 48 bytes / 1 | NO | NO | NO | SÍ |
| `tests/` | Pruebas PHP/JS/Playwright/IA, fixtures, diagnósticos y resultados | tests + outputs | 955,31 MiB / 7.316 | NO, con salvedad temporal IA indicada abajo | NO | NO | SÍ de producción |
| `tmp/` | Referencias temporales Harbour/Xailer | temporal | 0,03 MiB / 1 | NO | NO | NO | SÍ |
| `tools/` | Importadores LL12, compatibilidad, engine Harbour, renderers, exportadores y build Xailer | fuente + vendor + build + output | 280,51 MiB / 885 | Solo `ll12_import/import_lst.php` si se ofrece conversión API | SÍ | SÍ | Selectivo |

Carpeta indicada en el encargo pero inexistente: `servidor_php/`. La carpeta real es `servidor/`.

Artefactos sueltos relevantes en la raíz:

- `TRenderTPrinter.o`: objeto PE/i386 trackeado; candidato a sacar de Git.
- `hb_out.log`: log ignorado, regenerable.
- `__tmp_ia_bulk_color_probe.php`: sonda temporal ignorada, regenerable.
- `tools/harbour/stP1kAlM`: biblioteca `ar` PE/i386 sin extensión, trackeada; contiene objetos de una versión anterior del engine y es un artefacto temporal de build.

## 2. Diseñador web y deploy VPS

### Entrypoint y rutas cargadas

Entrypoint real: `public/index.php`.

Dependencias directas del navegador:

- `public/css/dominusll.css`;
- `public/js/Objects/*.js`, `public/js/Designer/*.js`, `public/js/Utils/TRichTextSanitizer.js`;
- `public/catalogos/paper_formats.json` y `public/catalogos/label_formats.json`;
- `public/vendor/pell/pell.min.js` y `pell.min.css`;
- `public/DesignerHelp/` para la ayuda integrada;
- `public/IA/TDesignerIA.js`, `public/IA/ia.css` y backend/contextos IA;
- Bootstrap 5.3.3, Font Awesome 6.5.2 y SweetAlert2 desde CDN. El VPS o los clientes necesitan acceso de red a esos CDNs mientras no se vendan localmente.

Endpoints realmente usados por el diseñador:

- `public/listTemplates.php`, `loadTemplate.php`, `saveTemplate.php`, `templateStorage.php`;
- `public/apiLLDominus.php` y `public/php/TApiLLDominus.php` para sesiones abiertas desde clientes externos;
- `public/motor/barcode_encode.php`;
- `public/motor/demo_data.php`;
- `public/motor/recurso_existe.php`;
- `public/motor/validar_formula.php`;
- `public/motor/preview.php`;
- `public/motor/export_ir.php`;
- `public/motor/clases/`, `public/motor/lenguaje/` y las clases de `public/php/`.

Requisitos PHP observados:

- PHP `>=8.0` según `composer.json` y por el uso de funciones de PHP 8;
- extensiones base JSON y ctype;
- DOM obligatoria para sanitización de rich text;
- iconv y mbstring recomendadas/efectivamente necesarias para el tratamiento completo de RTF y Unicode;
- cURL obligatoria si se activa IA;
- permiso de escritura en los almacenes descritos abajo;
- no hay paquetes Composer de runtime y no existe `vendor/` Composer necesario.

### Rutas writable actuales

- `lbl/` y `lst/`: guardar y crear plantillas desde el diseñador.
- `LLDOMINUS_API_STORAGE` o, si no está definida, el temp del sistema en `ll_dominus_designer_api/`: sesiones de `apiLLDominus.php`.
- temp del sistema: payloads temporales de preview/export IR.
- `public/runtime/debug_ir/`: `export_ir.php` guarda siempre una copia IR; deben desplegarse solo el directorio vacío y permisos, nunca los 152 JSON históricos actuales.
- `tests/ia/work/manual-designer/`: el endpoint IA escribe fallos y reparaciones aquí. Es una ruta de desarrollo usada por runtime y debe migrarse a almacenamiento configurable (`var/ia/`) antes del deploy limpio.

### VPS_OBLIGATORIO, estado actual

Para el diseñador completo, preservando las rutas actuales:

```text
public/index.php
public/apiLLDominus.php
public/listTemplates.php
public/loadTemplate.php
public/saveTemplate.php
public/templateStorage.php
public/catalogos/
public/css/
public/DesignerHelp/
public/IA/                         excepto run_tests.php y tools/
public/js/
public/php/                       excepto php/tests/
public/vendor/pell/
public/motor/barcode_encode.php
public/motor/demo_data.php
public/motor/export_ir.php
public/motor/preview.php
public/motor/recurso_existe.php
public/motor/validar_formula.php
public/motor/clases/
public/motor/datos/datos_prueba.json
public/motor/lenguaje/
public/runtime/debug_ir/          vacío y writable
lbl/                             vacío o con plantillas aprobadas; writable
lst/                             vacío o con plantillas aprobadas; writable
```

Si el servidor debe admitir `convertll12` para `TApiDisenadorLLDominus`, añadir:

```text
tools/ll12_import/import_lst.php
```

`FromContent()` es autocontenido y no necesita el corpus ni las salidas de `tools/ll12_import/output/`.

Mientras no se corrija la ruta de logs IA, el comportamiento completo de reparación automática exige además que PHP pueda crear/escribir `tests/ia/work/manual-designer/`. No se recomienda subir `tests/`; se recomienda corregir esa ruta antes de producción.

### VPS_OPCIONAL

- Plantillas aprobadas de `lbl/*.lbl` y sus datos `lbl/demo/*.json`.
- `public/motor/index.php` y `public/motor/README.md`, solo para demo/diagnóstico manual; no para producción pública.
- `public/fonts/` y `public/img/` están vacíos; solo conservar si se adoptan como ubicación real de assets.
- `public/motor/tests/fixtures/logo.png` y `.jpg` únicamente para que los ejemplos actuales de `lbl/demo/` no pierdan sus imágenes. La ubicación correcta futura es un directorio de assets/sample, no `tests/`.
- IA puede deshabilitarse conceptualmente, pero hoy `index.php` incluye su catálogo y JS de forma incondicional; quitarla del paquete requiere antes un cambio de configuración/código.

### VPS_NO_SUBIR

```text
.agents/
.git/
cliente/
docs/
json/
lst-antiguos/
node_modules/
pdf/
samples/
servidor/
test-results/
tests/                       salvo corregir antes la ruta runtime IA
tmp/
tools/bugimport/
tools/harbour/
tools/ll12_audit/
tools/ll12_compat/
tools/ll12_import/output/
tools/ll12_import/test_*.php
public/IA/run_tests.php
public/IA/tools/
public/motor/herramientas/
public/motor/tests/
public/php/tests/
public/runtime/debug_ir/*.json
hb_out.log
__tmp_*.php
TRenderTPrinter.o
```

### `node_modules` en VPS

No es necesario. `package.json` existe para Playwright y herramientas Node. `pell` ya está vendorizado en `public/vendor/pell/`. No hay bundling ni servidor Node en el runtime web.

## 3. Paquete conceptual mínimo del diseñador

Sin crear nada aún:

```text
deploy/designer/
├── public/                    # document root Apache/Nginx
│   ├── index.php
│   ├── apiLLDominus.php
│   ├── listTemplates.php
│   ├── loadTemplate.php
│   ├── saveTemplate.php
│   ├── templateStorage.php
│   ├── catalogos/
│   ├── css/
│   ├── DesignerHelp/
│   ├── IA/                   # runtime, no tests/tools
│   ├── js/
│   ├── motor/                # endpoints + clases/datos/lenguaje
│   ├── php/                  # sin tests
│   ├── runtime/debug_ir/     # vacío, writable o desactivado en producción
│   └── vendor/pell/
├── lbl/                       # writable; plantillas aprobadas
├── lst/                       # writable; plantillas aprobadas
├── tools/ll12_import/
│   └── import_lst.php         # solo si se ofrece convertll12
└── var/                       # propuesta, requiere cambio de rutas
    ├── api-sessions/
    └── ia/
```

El document root debe apuntar a `deploy/designer/public`, no al nivel superior. Antes de materializarlo hay que hacer configurables `lbl/`, `lst/`, `runtime/debug_ir/` y logs IA para evitar escrituras dentro del código desplegado.

## 4. Engine multiplataforma

### ENGINE_SOURCE

- Núcleo: `tools/harbour/engine/*.prg` (25 clases).
- Entrada/fachada: `tools/harbour/engine/TLLEngine.prg`.
- IR: `TDocumentoRenderizable.prg`; composición/paginación en `TMotorComposicion.prg`, `TMotorPaginacion.prg`, `TMotorEjecucion.prg`.
- Evaluador: `TEvaluadorFormulas.prg` y `TFuncFormulas.prg`.
- Datos: `TConectorDatos.prg`, `TConectorDatosReg.prg`, `TContextoEjecucion.prg`.
- Modelos compartidos: `TDocument`, `TPlantilla`, `TObjectBase`, `TText`, `TFormattedText`, `TRichText`, `TRectangle`, `TEllipse`, `TLine`, `TImage`, `TBarcode`, `TChart`, `TTable` y utilidades.
- Renderers: `tools/harbour/renderers/TRenderPDF.prg`, `TRenderImage.prg`, `TRenderImageBackend.c`.
- Exportadores: `tools/harbour/exporters/TExportCSV.prg`, `TExportXLSX.prg`, `TExportXLSXBackend.c`.

### ENGINE_VENDOR

- `tools/harbour/renderers/vendor/stb/`: `stb_image.h`, `stb_image_write.h`, `stb_truetype.h`.
- `tools/harbour/exporters/vendor/libxlsxwriter-1.2.4/`: fuentes, headers y licencia BSD-2-Clause de libxlsxwriter, incluyendo minizip, md5 y tmpfileplus.
- Dependencias externas no vendorizadas: Harbour, `hbhpdf`, libHaru, libpng, zlib y, para la biblioteca Xailer integrada, hbct. Deben proceder del mismo toolchain/ABI.
- Fuentes del sistema en runtime: Windows Fonts; DejaVu/Liberation/msttcorefonts en Linux; fuentes de usuario; y rutas macOS. No se incluyen tipografías propias en el engine.

### ENGINE_BUILD

- `tools/harbour/build_liblldominus.bat`: build de la biblioteca estática.
- `tools/harbour/env_harbour.bat`, `config.bat`: entorno local; `config.bat` contiene rutas absolutas `C:\local\harbour`.
- `build_prg.bat`, `build_and_run_prg.bat`, `build_engine_test.bat`, `clean_prg.bat`: build/test Windows.
- No hay `.sh`, CMake, Makefile ni pipeline de build Linux. El código pretende ser portable, pero el build reproducible disponible es Windows.

### ENGINE_TESTS

- `tools/harbour/tests/`: pruebas PRG, fixtures y comparadores PHP.
- Ejecutables `.exe`, logs y salidas XLSX/trace dentro de esa carpeta son outputs regenerables, no tests fuente.

### ENGINE_OUTPUT

- Biblioteca encontrada: `tools/harbour/lib/liblldominus.a`.
- Tamaño: 1.499.106 bytes (1,430 MiB).
- Formato inspeccionado: archivo `ar` con objetos `pe-i386`; plataforma Windows, arquitectura x86 de 32 bits.
- Estado Git: ignorada por `/tools/harbour/lib/*.a`.
- No se encontró `.so`, biblioteca Linux, DLL, LIB MSVC ni build de 64 bits.

## 5. Exportadores

| Formato | Fuente definitiva | Dependencias | Incluido en `liblldominus.a` | Runtime externo | Portabilidad |
|---|---|---|:---:|---|---|
| PDF | `tools/harbour/renderers/TRenderPDF.prg` | Harbour `hbhpdf`, libHaru; libpng/zlib al integrar Xailer; fuentes del SO | SÍ | Fuentes y bibliotecas enlazadas; imágenes desde IR/rutas | Conceptualmente Windows/Linux/macOS; solo build Windows comprobado |
| PNG/JPG/BMP | `TRenderImage.prg`, `TRenderImageBackend.c`, `renderers/vendor/stb/` | STB vendorizado, C runtime, fuentes TTF del SO | SÍ | Fuentes TTF y recursos de imagen referenciados | C/Harbour portable; solo build Windows comprobado |
| CSV | `tools/harbour/exporters/TExportCSV.prg` | Harbour/filesystem | SÍ | Ninguno aparte de permisos/ruta de salida | Multiplataforma por diseño; solo build Windows comprobado |
| XLSX | `TExportXLSX.prg`, `TExportXLSXBackend.c`, `exporters/vendor/libxlsxwriter-1.2.4/` | libxlsxwriter vendorizada y zlib del toolchain | SÍ | Bibliotecas enlazadas; no DLL/fichero de datos propio si se enlaza estáticamente | Fuente portable; solo build Windows comprobado |

Funciones públicas encontradas: `LLDominusExportPDF`, `LLDominusExportPNG`, `LLDominusExportJPG`, `LLDominusExportBMP`, `LLDominusExportImage`, exportación de todas las páginas, `LLDominusExportCSV`, `LLDominusExportAllTablesCSV`, `LLDominusExportXLSX` y `LLDominusExportAllTablesXLSX`.

La carpeta que debe conservarse como fuente definitiva de exportadores es el conjunto `tools/harbour/renderers/` + `tools/harbour/exporters/`, incluidos sus dos árboles `vendor/`.

## 6. Xailer / Windows

### XAILER_SOURCE

- Cliente para abrir el diseñador/API HTTP: `tools/harbour/xailer/TApiDisenadorLLDominus.prg`.
- Fachada del flujo completo diseño/preview/impresión: `TLLDominusPrintJob.prg`.
- Preview: `TLLPreview.prg`, `TFormLLPreview.prg`, `TLLPreviewCache.prg`, `TLLPreviewDiagnostics.prg`.
- Renderer/impresión/EMF: `TRenderTPrinter.prg`; genera páginas a través de `TPrinter:oPreviewDC`/`TEnhMetaFile` y el preview imprime mediante `TPrinter:EmfToPrinter()`.
- Formularios auxiliares: `TFormLLDominusProgress.prg`, `TFormLLDominusAskString.prg`, `TFormLLDominusLabelStart.prg`.
- Ejemplos: `tools/harbour/xailer/examples/`.

`TPrinter`, `TPreviewDC`, `TEnhMetaFile`, Canvas y framework GUI son clases de Xailer, no clases propias definitivas. Existe un snapshot ignorado en `tools/harbour/ClasesXailer/` (564 archivos, 3,986 MiB), que incluye `Source/TClasses/TPrinter.prg` y `TEnhMetaFile.prg`; el build oficial no lo usa y apunta a una instalación Xailer externa.

### XAILER_BUILD

- Script: `tools/harbour/xailer/build_libXaLLDominus.bat`.
- Objetos esperados: diez `.o` compilados por el proyecto Xailer externo en `C:\local\xailer9\Proyectos\LLDominus\Obj`.
- El script extrae `liblldominus.a`, hbhpdf, libHaru, libpng, zlib y hbct; añade los objetos Xailer; y crea una biblioteca estática integrada.
- Falta en el repo `tools/harbour/xailer/TFormLLPreview.xfm`, requerido por `#include "TFormLLPreview.xfm"`. Por tanto el conjunto de fuentes visible no es autosuficiente para recompilar ese formulario sin recuperarlo del proyecto Xailer externo o regenerarlo de forma controlada.

### XAILER_OUTPUT

- Ruta configurada: `C:\local\xailer9\Proyectos\LLDominus\lib\libXaLLDominus.a`.
- Estado al auditar: no existe.
- No se encontró `libXaLLDominus.a` dentro del repositorio.
- `TRenderTPrinter.o` en la raíz es un objeto parcial PE/i386, no la biblioteca final.

### XAILER_TESTS

- Ejemplos en `tools/harbour/xailer/examples/`.
- Contratos relacionados en `tools/harbour/tests/test_xailer_renderer_contract.php`, `test_preview_cache_contract.php` y pruebas PRG/cliente.
- `tmp/xailer_syntax/` es temporal, no fuente.

## 7. Auditoría de tests

| Ruta | Contenido | Archivos | Tamaño |
|---|---|---:|---:|
| `tests/api_designer/` | Test PHP de sesiones API | 1 | <0,01 MiB |
| `tests/designer/` | 40 specs Playwright del diseñador | 40 | 0,43 MiB |
| `tests/playwright/` | 9 specs runtime/visual/LL12 | 9 | 0,05 MiB |
| `tests/ia/diagnostics/` | Capturas de transporte y diagnósticos | 24 | 0,26 MiB |
| `tests/ia/fixtures/` | Fixture estable | 1 | <0,01 MiB |
| `tests/ia/tools/` | Herramientas y pruebas offline/online | 36 | 0,21 MiB |
| `tests/ia/work/` | checkpoints y trabajo efímero | 67 | 21,70 MiB |
| `tests/ia/results/` | 388 ejecuciones, informes y casos generados | 7.121 | 932,51 MiB |
| `tests/results/` | resumen pequeño de prueba | 1 | <0,01 MiB |

Tests necesarios y útiles para conservar como fuente:

- `tests/api_designer/*.php`;
- `tests/designer/*.spec.js`;
- `tests/playwright/*.spec.js`;
- `tests/ia/*.php`, `tests/ia/core-cases.json`, `tests/ia/fixtures/` y `tests/ia/tools/`;
- `public/motor/tests/`, `public/php/tests/` y `tools/harbour/tests/` en el repositorio de desarrollo, excluyendo binarios/logs/salidas.

Resultados IA:

- Extensiones: 6.027 JSON (922,48 MiB), 980 Markdown (5,77 MiB), 13 PNG (1,90 MiB), 61 CSV (0,96 MiB), 38 TXT (1,39 MiB), 2 DIFF.
- Repetición exacta: 639 grupos de hashes duplicados; 2.556 copias redundantes; 306,51 MiB recuperables solo eliminando duplicados exactos.
- Dos generadores de `public/IA/tools/` escriben en rutas nominales concretas (`20260807_phase6_context`, `20260807_semantic_markdown`); son outputs regenerables, no dependencias de runtime.
- Valor histórico alto: carpetas nominales con `README.md`, comparativas, arquitectura, estabilidad, recomendación o cierre, por ejemplo `core_large_model_control`, `core_stability_5runs`, `designer_command_architecture_analysis`, `explicit_visual_defaults*`, `geometry_group_analysis`, `gptoss_vs_big_pickle`, `controlled_gptoss_vs_big_pickle`, `manual_commands_integration`, `sequential_transaction`, `utf8_prompt_fix`, `visual_properties_group`, `autonomous_*` y cierres `commands_*`. Archivar sus informes/resúmenes y, cuando sea necesario reproducir, el raw mínimo.
- Valor histórico bajo/repetible: ráfagas timestamp con solo `cases/`, `results.json`, `summary.json` y `report.md`, especialmente las series por segundos de 20260808 y las seis copias de `*_modernized_harness` de 26,47 MiB. Conservar una ejecución representativa por versión/modelo/configuración y archivar o borrar las demás tras backup.

No hay referencias del runtime de producción a `tests/ia/results/`. La carpeta completa está ignorada por Git.

## 8. `test-results/`

Contiene únicamente `.last-run.json` con `status: passed` y `failedTests: []`. Corresponde a Playwright según `playwright.config.js`. Es regenerable, debe permanecer ignorado y su fichero ya trackeado debe dejar de trackearse en una fase posterior (sin borrar historial).

## 9. Node

- Manifiestos: `package.json` y `package-lock.json` en la raíz.
- Dependencias instaladas: `@playwright/test@1.61.1`, `@zxing/library@0.23.0`, `pngjs@7.0.0`, `pell@1.0.6`.
- Script npm: `test:designer` ejecuta Playwright.
- `node_modules/` no participa en PHP, Apache, Nginx ni JS servido al navegador.
- 186 ficheros de Playwright siguen trackeados pese a que `node_modules/` está ahora ignorado. Deben sacarse del índice Git en una fase aprobada posterior.

## 10. JSON / LBL / LST / PDF / samples

- `json/`: solo `.gitkeep`; no contiene documentos runtime.
- `lbl/`: 19 `.lbl` Dominus (3,025 MiB) y 10 JSON demo (1,130 MiB). Son plantillas importadas, pruebas y ejemplos; no deben desplegarse todas por defecto. Varias plantillas apuntan a `lbl/demo/...`.
- `lbl/demo/`: datos demo. Varios apuntan a `public/motor/tests/fixtures/logo.png`, mezcla de sample con test que debe corregirse antes de eliminar fixtures.
- `lst/`: solo `.gitkeep`; es un almacén writable actual, no contiene fixtures.
- `lst-antiguos/`: corpus LL12 histórico: 668 `.lst`, 96 `.lbl`, 60 `.lst~0`, 29 `.lst_old`, 6 `.lbl_old`, imágenes, backups y tres paquetes `.pkz/.pkz2`. No es runtime. Conviene archivar con checksum y catálogo antes de retirarlo del repo activo.
- `pdf/`: solo `.gitkeep`; no hay PDFs generados ni runtime.
- `samples/`: solo `.gitkeep`; los ejemplos reales están dispersos en `lbl/`, `tools/*/output`, `tools/harbour/xailer/examples` y tests.

## 11. Temporales y artefactos

Conteo orientativo por coincidencia de rutas/extensiones (las categorías se solapan):

| Categoría | Archivos | Tamaño | Trackeados |
|---|---:|---:|---:|
| temp/work | 69 | 21,73 MiB | 0 |
| logs | 3 | 0,04 MiB | 0 |
| screenshots/traces | 21 | 1,61 MiB | 21; son principalmente imágenes del manual y no deben borrarse por patrón |
| results/output/cache | 7.212 | 1.193,29 MiB | 64 / 4,90 MiB |
| build (`.o/.obj/.exe/.a/...`) | 165 | 16,47 MiB | 1 (`TRenderTPrinter.o`); además `stP1kAlM` no coincide por no tener extensión |

Principales regenerables:

- `tests/ia/work/`, `tests/ia/results/`, `test-results/`;
- `public/runtime/debug_ir/*.json`;
- `tools/ll12_compat/output/` (255,88 MiB);
- binarios/logs de `tools/harbour/tests/`;
- `hb_out.log`, `__tmp_*.php`, `tmp/`, `TRenderTPrinter.o`, `tools/harbour/stP1kAlM`;
- `node_modules/`, reinstalable con lockfile.

Las salidas de `tools/ll12_import/output/` y `tools/ll12_audit/output/` están trackeadas y pueden funcionar como baselines/evidencia. No deben borrarse sin decidir primero qué outputs pasan a fixtures doradas y cuáles se regeneran.

## 12. Git y `.gitignore`

Estado observado: working tree limpio antes de crear este informe.

Situaciones detectadas:

- `.gitignore` ignora `node_modules/`, pero 186 ficheros ya trackeados siguen dentro del índice.
- Ignora todo `/tests/`; esto oculta tanto outputs como nuevos tests fuente útiles. El árbol contiene muchos specs no trackeados.
- `test-results/.last-run.json` sigue trackeado aunque `/test-results/` está ignorado.
- `TRenderTPrinter.o`, `tools/harbour/stP1kAlM`, 2 salidas `ll12_audit` y 60 salidas `ll12_import` están trackeados.
- `public/runtime/debug_ir/*.json`, `tests/ia/results/`, `tests/ia/work/`, `tools/ll12_compat/output/*` y builds Harbour están correctamente ignorados en gran parte.
- `*.lbl` ignora todas las nuevas plantillas, mientras muchas plantillas existentes ya están trackeadas. Esta regla puede ocultar plantillas fuente nuevas legítimas.
- `docs/ia-reference/` está ignorado aunque contiene documentación potencialmente valiosa; debe decidirse si es documentación oficial o material privado/local.

Cambios recomendados, sin aplicarlos:

```gitignore
# Mantener tests fuente; ignorar solo outputs.
!/tests/
!/tests/**/*.php
!/tests/**/*.js
!/tests/**/*.json              # ajustar: fixtures sí, resultados no
/tests/ia/results/
/tests/ia/work/
/tests/ia/diagnostics/
/tests/results/
/test-results/
/playwright-report/
/blob-report/
/coverage/

# Runtime generado.
/public/runtime/debug_ir/
/var/

# Builds.
*.o
*.obj
*.exe
*.dll
*.so
*.a
*.lib
/tools/harbour/st*
/tools/harbour/lib/

# Outputs de herramientas, con excepciones explícitas para fixtures doradas.
/tools/ll12_audit/output/
/tools/ll12_import/output/
/tools/ll12_compat/output/*
!/tools/ll12_compat/output/.gitignore

# No ignorar globalmente todas las plantillas fuente.
# Sustituir *.lbl por reglas dirigidas a outputs/temporales concretos.
```

Además de cambiar reglas, una fase posterior tendría que ejecutar `git rm --cached` sobre artefactos ya trackeados. No se ha hecho en esta auditoría.

## 13. Propuesta de estructura futura

Prioridad: migración gradual, sin romper includes ni builds.

```text
/designer/
  /public/                    document root
  /src/                       PHP del diseñador/API
  /assets/                    JS/CSS/catalogs/help/vendor frontend
  /config/
/engine/
  /src/                       actual tools/harbour/engine
  /renderers/
  /exporters/
  /vendor/                    STB y libxlsxwriter
  /build/
/xailer/
  /src/
  /forms/                     PRG + XFM completos
  /examples/
  /build/
/server-php-reference/        cliente/ + servidor/, si se conserva
/samples/
  /templates/
  /data/
  /assets/
/tests/
  /designer/
  /engine/
  /xailer/
  /ia/
/docs/
/var/                         ignorado: sesiones, logs, IR, resultados
/build/                       ignorado: objetos y temporales
/dist/                        paquetes versionados fuera del source tree
/archive/                     preferiblemente almacenamiento externo
```

Secuencia de mínimo riesgo:

1. Crear primero scripts/manifiestos de empaquetado que copien desde las rutas actuales; no mover fuentes.
2. Parametrizar storage (`templates`, sesiones, IR, IA logs) y eliminar la dependencia runtime de `tests/`.
3. Separar fixtures/sample assets de `public/motor/tests/fixtures/`.
4. Recuperar/registrar `TFormLLPreview.xfm` y hacer reproducible el build Xailer.
5. Añadir build Linux/64-bit del engine y publicar matriz de ABI.
6. Solo después mover carpetas, una familia cada vez, actualizando includes y pruebas.

## 14. Distribuciones finales propuestas

### A. DEPLOY WEB DESIGNER

Contenido exacto desde rutas actuales:

- el subconjunto `public/` enumerado en `VPS_OBLIGATORIO`;
- `lbl/` y `lst/` vacíos/writable más plantillas explícitamente aprobadas;
- `tools/ll12_import/import_lst.php` si se mantiene `convertll12`;
- configuración externa: `LLDOMINUS_API_KEY`, `LLDOMINUS_API_STORAGE`, credenciales/URL IA, límites PHP y TLS;
- directorios writable vacíos para sesiones, IR y logs, nunca resultados históricos;
- assets CDN vendorizados localmente o conectividad saliente documentada.

Excluir: Composer dev inexistente, Node, tests, docs internas, Harbour, Xailer, corpus LL12, outputs y logs.

### B. ENGINE MULTIPLATAFORMA

Paquete fuente:

```text
tools/harbour/engine/
tools/harbour/renderers/
tools/harbour/exporters/
tools/harbour/build_liblldominus.bat
tools/harbour/build_prg.bat
tools/harbour/build_and_run_prg.bat
tools/harbour/build_engine_test.bat
tools/harbour/clean_prg.bat
tools/harbour/env_harbour.bat
tools/harbour/config.bat           como ejemplo, sin rutas locales fijas en dist final
tools/harbour/README.md
tools/harbour/PORTING_PLAN.*       documentación SDK opcional
```

Paquete binario actual: `tools/harbour/lib/liblldominus.a`, etiquetado claramente `windows-x86-mingw`; no llamarlo todavía «multiplataforma binario». Añadir en el futuro artefactos separados `windows-x86`, `windows-x64`, `linux-x64` con toolchain, ABI, checksum y dependencias.

### C. XAILER WINDOWS

```text
tools/harbour/xailer/*.prg
tools/harbour/xailer/TFormLLPreview.xfm       falta actualmente
tools/harbour/xailer/examples/
tools/harbour/xailer/README_preview.md
tools/harbour/xailer/build_libXaLLDominus.bat
liblldominus.a compatible con el Harbour de Xailer
libXaLLDominus.a                              falta actualmente
```

No incluir el snapshot completo `tools/harbour/ClasesXailer/` salvo que la licencia y la estrategia de vendor lo exijan; el producto debe declarar una versión de Xailer/Harbour compatible. No incluir `TRenderTPrinter.o` suelto.

## 15. Candidatos a limpieza

### BORRADO_SEGURO, después de backup/confirmación

- `node_modules/` (reinstalable con `package-lock.json`), después de sacar los 186 ficheros del índice.
- `test-results/` y `.last-run.json`.
- `public/runtime/debug_ir/*.json`.
- `tests/ia/work/`.
- binarios/logs/salidas generadas de `tools/harbour/tests/`.
- `hb_out.log`, `__tmp_ia_bulk_color_probe.php`, `tmp/`, `TRenderTPrinter.o`.
- `tools/harbour/stP1kAlM`, tras verificar que `liblldominus.a` y el source actual son el baseline correcto.
- `tools/ll12_compat/output/`, incluido el JSON de 238,34 MiB, porque está ignorado y es regenerable; conservar antes un resumen/baseline pequeño si se usa para aceptación.
- duplicados exactos SHA-256 de `tests/ia/results/` (306,51 MiB), después de backup.

### ARCHIVAR

- `lst-antiguos/` completo, con checksum e índice por tipo; tiene valor como corpus LL12 pero no debe permanecer en el repo activo.
- ejecuciones IA nominales de análisis, estabilidad, comparativa y cierre; conservar informes/resúmenes y raw mínimo.
- una ejecución representativa por modelo/configuración/batería de las series timestamp.
- diagnósticos IA de transporte que documenten incidentes resueltos.
- outputs trackeados de `tools/ll12_import/output/` y `tools/ll12_audit/output/` que se consideren evidencias históricas, moviéndolos conceptualmente a un archivo o convirtiéndolos en fixtures doradas pequeñas.
- `tools/bugimport/` si representa casos reales de regresión; idealmente reducirlo a fixtures documentadas.

### CONSERVAR

- fuentes del diseñador (`public` selectivo), engine, renderers, exportadores y Xailer.
- vendors STB, libxlsxwriter y Pell con licencias.
- manifiestos/locks y scripts de build.
- tests fuente y fixtures mínimos reproducibles.
- documentación de arquitectura/lenguaje y manual integrado del diseñador.
- plantillas productivas aprobadas y datos sample explícitos.
- `cliente/` y `servidor/` mientras sean referencia funcional PHP o SDK soportado.

## 16. Problemas de organización detectados

1. `public/` mezcla runtime, motor de referencia, tests, herramientas y 16,01 MiB de IR de debug.
2. `tools/` mezcla fuente definitiva, vendor, builds, snapshots de terceros y 260+ MiB de outputs.
3. `tests/ia/results/` acumula 388 ejecuciones sin política de retención y con 306,51 MiB de duplicados exactos.
4. El runtime IA escribe bajo `tests/`, impidiendo una frontera limpia de producción.
5. Los assets sample apuntan a `public/motor/tests/fixtures/`.
6. `.gitignore` ignora todo `tests/` y todas las nuevas `.lbl`, ocultando fuente potencialmente válida.
7. Existen artefactos de build trackeados y `node_modules` parcialmente trackeado.
8. La biblioteca engine actual no está versionada como artefacto y solo existe para Windows x86.
9. No existe build Linux ni matriz de plataforma/arquitectura.
10. La biblioteca Xailer final no existe en la ruta configurada ni en el repo.
11. Falta `TFormLLPreview.xfm`; el source Xailer no es autosuficiente.
12. Los scripts de build contienen rutas locales absolutas y dependen de toolchains externos.
13. `servidor/` y `cliente/` son referencia PHP, mientras el diseñador usa directamente `public/motor`; sus nombres no expresan con claridad ese alcance.
14. `samples/`, `json/` y `pdf/` están vacíos, mientras samples y outputs reales están dispersos.
15. El frontend depende de CDNs sin copia local completa ni política de disponibilidad/CSP documentada.
16. `demo_data.php` puede leer JSON bajo toda la raíz del paquete si se conoce una ruta válida; conviene restringirlo a un directorio sample configurado antes de producción.

## 17. Respuestas directas solicitadas

1. **Carpetas root encontradas:** `.agents`, `.git`, `cliente`, `docs`, `json`, `lbl`, `lst`, `lst-antiguos`, `node_modules`, `pdf`, `public`, `samples`, `servidor`, `test-results`, `tests`, `tmp`, `tools`.
2. **Carpeta/entrypoint real del diseñador web:** `public/index.php`.
3. **Carpetas exactas necesarias para VPS:** `public/` selectivo, `lbl/`, `lst/`; `tools/ll12_import/import_lst.php` si se usa conversión LL12; stores writable externos/temporales. Detalle en sección 2.
4. **Carpetas que NO deben subirse al VPS:** `.agents`, `.git`, `cliente`, `docs`, `json`, `lst-antiguos`, `node_modules`, `pdf`, `samples`, `servidor`, `test-results`, `tests`, `tmp` y casi todo `tools`; detalle en `VPS_NO_SUBIR`.
5. **¿`node_modules` es necesario en VPS?:** NO.
6. **Ruta exacta de fuentes del engine:** `C:\xampp\htdocs\LL-Dominus\tools\harbour\engine`.
7. **Ruta exacta de librería final del engine:** `C:\xampp\htdocs\LL-Dominus\tools\harbour\lib\liblldominus.a`; Windows PE/i386, 32 bits.
8. **Ruta exacta de exportadores:** `C:\xampp\htdocs\LL-Dominus\tools\harbour\renderers` para PDF/imagen y `C:\xampp\htdocs\LL-Dominus\tools\harbour\exporters` para CSV/XLSX.
9. **Dependencias vendor del engine:** `renderers/vendor/stb` y `exporters/vendor/libxlsxwriter-1.2.4`; externamente Harbour/hbhpdf/libHaru/libpng/zlib/hbct según paquete.
10. **Ruta exacta del cliente Xailer:** `tools/harbour/xailer/TApiDisenadorLLDominus.prg` y fachada `TLLDominusPrintJob.prg`.
11. **Ruta exacta del preview Xailer:** `tools/harbour/xailer/TLLPreview.prg`, `TFormLLPreview.prg`, `TLLPreviewCache.prg`, `TLLPreviewDiagnostics.prg`.
12. **Ruta exacta del renderer/impresión Windows:** `tools/harbour/xailer/TRenderTPrinter.prg`; usa `TPrinter`/EMF de Xailer.
13. **Ruta exacta de librería Xailer final:** configurada como `C:\local\xailer9\Proyectos\LLDominus\lib\libXaLLDominus.a`; no existe al auditar.
14. **Qué contiene `cliente`:** `cliente/php/TLLDominusPHP.php`, demo `preview_demo.php` y `runtime_demo.json`; cliente/runtime PHP de referencia, no Xailer.
15. **Qué contiene `servidor_php`:** no existe. `servidor/php/TPreviewPHP.php` contiene la fachada/render HTML del cliente PHP.
16. **Qué contiene `json`:** solo `.gitkeep`.
17. **Qué contiene `lbl`:** 19 plantillas `.lbl` y 10 JSON demo, 4,16 MiB.
18. **Qué contiene `lst`:** solo `.gitkeep`; almacén runtime vacío.
19. **Qué contiene `lst-antiguos`:** corpus/backups LL12 de 875 archivos y 150,01 MiB.
20. **Qué contiene `pdf`:** solo `.gitkeep`.
21. **Qué contiene `samples`:** solo `.gitkeep`.
22. **Qué contiene `test-results`:** `.last-run.json` de Playwright, 48 bytes, regenerable.
23. **Tamaño total de `tests`:** 1.001.715.067 bytes, 955,31 MiB, 7.316 archivos.
24. **Tamaño de `tests/ia/results`:** 977.808.366 bytes, 932,51 MiB.
25. **Número de archivos en `tests/ia/results`:** 7.121 archivos, 388 carpetas de ejecución.
26. **Qué puede borrarse con seguridad:** outputs regenerables listados en `BORRADO_SEGURO`, siempre después de backup/confirmación; nada se borró ahora.
27. **Qué debería archivarse:** corpus `lst-antiguos`, informes IA seleccionados, diagnósticos resueltos y evidencias LL12 descritas en `ARCHIVAR`.
28. **Qué debe conservarse:** fuente, vendors/licencias, build scripts, tests fuente, fixtures mínimos, docs oficiales y plantillas aprobadas.
29. **Problemas actuales:** mezcla runtime/test/output, rutas writable dentro de source/tests, artefactos trackeados, builds no reproducibles multiplataforma, output Xailer ausente y XFM faltante; sección 16.
30. **Propuesta de estructura futura:** `/designer`, `/engine`, `/xailer`, `/server-php-reference`, `/samples`, `/tests`, `/docs`, `/var`, `/build`, `/dist`, `/archive`, migrada por fases.
31. **Contenido DEPLOY WEB DESIGNER:** subconjunto exacto de sección 2 y paquete A de sección 14.
32. **Contenido ENGINE MULTIPLATAFORMA:** engine + renderers + exporters + vendors + build/docs; binarios por plataforma separados. Hoy solo existe Windows x86.
33. **Contenido XAILER WINDOWS:** fuentes `tools/harbour/xailer`, XFM pendiente, engine ABI-compatible y `libXaLLDominus.a` pendiente.
34. **Cambios recomendados en `.gitignore`:** reemplazar ignores globales por ignores de outputs dirigidos, ignorar builds/reportes y dejar trackear tests/plantillas fuente; sección 12. No aplicados.
35. **Confirmación:** no se borró, movió ni renombró nada; no se cambió código, builds ni `.gitignore`. Solo se creó este informe.
36. **Ruta exacta del informe:** `C:\xampp\htdocs\LL-Dominus\docs\repository-cleanup-audit.md`.

