Mejoras transversales del motor AutomaticEDA (PDF + PPTX) sobre el modelo de bloques:
1. DPI alto global: toda figura/imagen embebida se rasteriza a 220 dpi (antes 150,
y en PDF la página se guardaba a ~100 dpi re-rasterizando los imshow). En PDF se
aplica savefig.dpi=220 a la página; el texto sigue vectorial y seleccionable.
Permite ampliar en el móvil sin pixelar. Imagen embebida medida: ~1081px (antes ~492px).
2. Tabla ancha → imagen de alta resolución: cuando un DataTable tiene demasiadas
columnas para ser legible como texto (criterio _table_fits_as_text), se dibuja entera
como una imagen nítida (nueva función render_table_as_figure_py_datascience: cabecera
sombreada + zebra) escalada para caber completa, de modo que el lector hace zoom y la
lee sin perder datos. Las tablas que sí caben siguen como texto seleccionable / tabla
nativa. Aplica en PDF y PPTX. El df.head de 19 columnas del dataset sintético ya no se
corta: sale como imagen.
3. Group.layout: nuevo hint retrocompatible (default "stack"). "side_by_side" coloca la
tabla a la izquierda (~55%) y la figura a la derecha (~45%) en la misma slide PPTX
(cae a apilado si no hay par tabla+figura o no caben); en PDF se trata como "stack"
(el ancho A5 móvil no admite dos columnas). Pensado para que el capítulo cat_distr
ponga el gráfico al lado de la tabla en PPT.
4. Portada con índice clicable: la lista de capítulos pasa de "Este informe incluye..."
(markdown) a un Heading "Índice" + un TocEntry por capítulo. El renderer registra el
inicio de cada capítulo y cablea cada entrada como salto real (PDF: link GOTO PyMuPDF;
PPTX: salto a slide nativo), reutilizando el mecanismo del glosario clicable.
Modelo: Group gana `layout`; nuevo bloque TocEntry; normalizers y __init__ actualizados.
Contrato: documentado en docs/automatic_eda_contract.md §11.4 (incluye el contrato exacto
del campo layout para el agente de cat_distr).
Tests: nuevo render_quality_test.py (13 golden: DPI alto real, tabla ancha→imagen PDF/PPTX,
narrow→texto, side_by_side PPTX dos columnas / PDF apilado, índice clicable PDF+PPTX,
retrocompatibilidad layout por defecto). render_features_test actualizado al índice nuevo.
Suite: 188 passed (módulo) + 38 passed/1 skipped (acceptance + pipeline).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Mejoras transversales del motor de render (no del contenido de capítulos):
1. Fix negrita pisa texto (PDF): _place_rich_lines mide el ancho REAL de cada
span con las métricas de fuente del renderer (peso correcto) en vez del
grid de ancho medio; negrita y normal en la misma línea ya no se solapan.
2. Zebra striping: filas pares sombreadas (#f6f8fa) en DataTable (PDF + PPTX),
coherente al partir tablas largas (índice de fila lógico, no por página).
3. Keep-together: bloque Group nuevo; el renderer mide el grupo entero y lo
mueve completo a la página/slide siguiente si no cabe, y encoge la figura
(height_in) para dejar sitio a su título y texto. num_distr lo usa.
4. Caption siempre visible en toda figura PPTX (fallback al heading); la figura
reserva el alto de su caption para que ambos quepan en el mismo slide.
5. Portada construida al final (con resumen agregado del análisis vía
ctx['document_summary']) pero colocada primera por build_document.
6. Glosario: capítulo nuevo (último) + GlossaryCollector en ctx; los capítulos
registran términos y marcan apariciones con [[term:key]]...[[/term]]. Links
clicables reales: PDF (PyMuPDF, link GOTO) y PPTX (slide-jump nativo).
Enganchado "entropía" en cat_distr como ejemplo end-to-end.
Funciones reutilizables delegadas a fn-constructor (tag eda):
- add_pdf_internal_links_py_datascience (PyMuPDF)
- pptx_link_run_to_slide_py_datascience (slide-jump)
Contrato docs/automatic_eda_contract.md actualizado (§1/§3/§5 + §11 nueva) con
la API de glosario, keep-together y zebra para la siguiente fase. PyMuPDF
declarado en pyproject. Suite verde (90 tests); golden titanic verificado.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Añade docs/automatic_eda_contract.md: documento autoritativo y autosuficiente
para que otros agentes escriban capítulos en paralelo (NUM DISTR, CAT DISTR,
CALIDAD, CORRELACIÓN, MODELOS, ANÁLISIS LLM, TIMESERIES, GEOSPATIAL,
AGREGACIÓN). Cubre el modelo de bloques/capítulo exacto, la firma
build_<chapter>(profile, ctx) -> Chapter|None, la declaración de
CHAPTER_VERSION, dónde colocar el módulo, cómo se registra el orden del
documento, qué claves del profile consume cada capítulo, las claves nuevas que
la fase de cálculo debe añadir (head_rows, columns[].examples) y un ejemplo
completo del capítulo de referencia OVERVIEW.
Enlaza las dos funciones nuevas y el contrato desde docs/capabilities/eda.md y
actualiza el recuento del grupo eda en el índice de capabilities.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>