feat: Enhance testing framework by adding new PDF files for count-api latency tests, updating .gitignore to include additional CSV reports, and refining documentation for improved clarity on test results and methodologies.

This commit is contained in:
erik
2026-07-13 22:46:19 -05:00
parent 1935552f4e
commit e47ef4f8c6
30 changed files with 488 additions and 217 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+121 -97
View File
@@ -9,124 +9,148 @@
\providecommand\HyField@AuxAddToFields[1]{}
\providecommand\HyField@AuxAddToCoFields[2]{}
\babel@aux{spanish}{}
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Resumen ejecutivo}{4}{chapter.1}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {1}Resumen ejecutivo}{5}{chapter.1}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:resumen}{{1}{4}{Resumen ejecutivo}{chapter.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Veredicto global}{4}{section.1.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {1.2}KPIs de la campa\~na}{4}{section.1.2}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {1.1}{\ignorespaces KPIs ejecutivos de la campa\~na.}}{4}{table.1.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {1.3}Respuesta directa: 100\,000 facturas/mes}{4}{section.1.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {1.4}Riesgo principal}{5}{section.1.4}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Objeto y alcance}{6}{chapter.2}\protected@file@percent }
\newlabel{ch:resumen}{{1}{5}{Resumen ejecutivo}{chapter.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {1.1}Veredicto global}{5}{section.1.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {1.2}KPIs de la campa\~na}{5}{section.1.2}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {1.1}{\ignorespaces KPIs ejecutivos de la campa\~na.}}{5}{table.1.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {1.3}Respuesta directa: 100\,000 facturas/mes}{5}{section.1.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {1.4}Riesgo principal}{6}{section.1.4}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {2}Objeto y alcance}{7}{chapter.2}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:alcance}{{2}{6}{Objeto y alcance}{chapter.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Objeto}{6}{section.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Alcance incluido}{6}{section.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Fuera de alcance de esta campa\~na}{6}{section.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.4}Definici\'on de factura}{6}{section.2.4}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Entorno bajo prueba}{7}{chapter.3}\protected@file@percent }
\newlabel{ch:alcance}{{2}{7}{Objeto y alcance}{chapter.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {2.1}Objeto}{7}{section.2.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.2}Alcance incluido}{7}{section.2.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.3}Fuera de alcance de esta campa\~na}{7}{section.2.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {2.4}Definici\'on de factura}{7}{section.2.4}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {3}Entorno bajo prueba}{8}{chapter.3}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:entorno}{{3}{7}{Entorno bajo prueba}{chapter.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Hardware y sistema}{7}{section.3.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {3.1}{\ignorespaces Host de ejecuci\'on.}}{7}{table.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Baseline de memoria (2026-07-13)}{7}{section.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.3}Salud del stack}{7}{section.3.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Huella de memoria por contenedor (idle). MLflow domina el host.}}{8}{figure.3.1}\protected@file@percent }
\newlabel{fig:memoria}{{3.1}{8}{Huella de memoria por contenedor (idle). MLflow domina el host}{figure.3.1}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Metodolog\'ia}{9}{chapter.4}\protected@file@percent }
\newlabel{ch:entorno}{{3}{8}{Entorno bajo prueba}{chapter.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {3.1}Hardware y sistema}{8}{section.3.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {3.1}{\ignorespaces Host de ejecuci\'on.}}{8}{table.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.2}Baseline de memoria (2026-07-13)}{8}{section.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {3.3}Salud del stack}{8}{section.3.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {3.1}{\ignorespaces Huella de memoria por contenedor (idle). MLflow domina el host.}}{9}{figure.3.1}\protected@file@percent }
\newlabel{fig:memoria}{{3.1}{9}{Huella de memoria por contenedor (idle). MLflow domina el host}{figure.3.1}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {4}Metodolog\'ia}{10}{chapter.4}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:metodologia}{{4}{9}{Metodolog\'ia}{chapter.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {4.1}Tipos de prueba}{9}{section.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.2}Herramientas}{9}{section.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.3}SLOs perfil \texttt {shared8g}}{9}{section.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.4}Comandos representativos}{9}{section.4.4}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Resultados --- pruebas unitarias}{10}{chapter.5}\protected@file@percent }
\newlabel{ch:metodologia}{{4}{10}{Metodolog\'ia}{chapter.4}{}}
\@writefile{toc}{\contentsline {section}{\numberline {4.1}Tipos de prueba}{10}{section.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.2}Herramientas}{10}{section.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.3}SLOs perfil \texttt {shared8g}}{10}{section.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {4.4}Comandos representativos}{10}{section.4.4}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {5}Resultados --- pruebas unitarias}{11}{chapter.5}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:unitarias}{{5}{10}{Resultados --- pruebas unitarias}{chapter.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {5.1}Scorecard}{10}{section.5.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {5.1}{\ignorespaces Resultados unitarios. $^{*}$Base 3 PASS confirmados en Ubuntu; ampliaci\'on features/clustering (+8) y Timing sobre 3 PDFs reales requieren \texttt {go test} en host con Tesseract.}}{10}{table.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.2}Cobertura agent}{10}{section.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.3}Cobertura API store}{10}{section.5.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.4}Cobertura count-api}{10}{section.5.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {5.1}{\ignorespaces Unitarias ejecutadas vs pendientes.}}{11}{figure.5.1}\protected@file@percent }
\newlabel{fig:unitarias}{{5.1}{11}{Unitarias ejecutadas vs pendientes}{figure.5.1}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Resultados --- humo y funcional}{12}{chapter.6}\protected@file@percent }
\newlabel{ch:unitarias}{{5}{11}{Resultados --- pruebas unitarias}{chapter.5}{}}
\@writefile{toc}{\contentsline {section}{\numberline {5.1}Scorecard}{11}{section.5.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {5.1}{\ignorespaces Resultados unitarios.}}{11}{table.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.2}Cobertura agent}{11}{section.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.3}Cobertura API store}{11}{section.5.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {5.4}Cobertura count-api}{11}{section.5.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {5.1}{\ignorespaces Unitarias ejecutadas vs pendientes.}}{12}{figure.5.1}\protected@file@percent }
\newlabel{fig:unitarias}{{5.1}{12}{Unitarias ejecutadas vs pendientes}{figure.5.1}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {6}Resultados --- humo y funcional}{13}{chapter.6}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:humo}{{6}{12}{Resultados --- humo y funcional}{chapter.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {6.1}Humo gateway}{12}{section.6.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {6.1}{\ignorespaces Humo HTTP.}}{12}{table.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.2}Funcional E2E-07 (worker offline $\rightarrow $ 409)}{12}{section.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.3}Script preparado}{12}{section.6.3}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Resultados --- pruebas de carga}{13}{chapter.7}\protected@file@percent }
\newlabel{ch:humo}{{6}{13}{Resultados --- humo y funcional}{chapter.6}{}}
\@writefile{toc}{\contentsline {section}{\numberline {6.1}Humo gateway}{13}{section.6.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {6.1}{\ignorespaces Humo HTTP.}}{13}{table.6.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.2}Funcional E2E-07 (worker offline $\rightarrow $ 409)}{13}{section.6.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {6.3}Script preparado}{13}{section.6.3}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {7}Resultados --- pruebas de carga}{14}{chapter.7}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:carga}{{7}{13}{Resultados --- pruebas de carga}{chapter.7}{}}
\@writefile{toc}{\contentsline {section}{\numberline {7.1}Tabla consolidada}{13}{section.7.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {7.1}{\ignorespaces M\'etricas de carga k6 (perfil shared8g).}}{13}{table.7.1}\protected@file@percent }
\newlabel{tab:carga}{{7.1}{13}{M\'etricas de carga k6 (perfil shared8g)}{table.7.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {7.2}ST-GW-01}{13}{section.7.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.3}ST-BOT-01 --- comparativa}{13}{section.7.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.4}Throughput gateway}{13}{section.7.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {7.1}{\ignorespaces p95 y max por caso. BOT1-max (23\,s) fuera de escala visual relativa --- ver tabla.}}{14}{figure.7.1}\protected@file@percent }
\newlabel{fig:latencias}{{7.1}{14}{p95 y max por caso. BOT1-max (23\,s) fuera de escala visual relativa --- ver tabla}{figure.7.1}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {7.2}{\ignorespaces Before/after heartbeats (eje limitado; valores exactos en tabla~\ref {tab:carga}).}}{14}{figure.7.2}\protected@file@percent }
\newlabel{fig:bot-before-after}{{7.2}{14}{Before/after heartbeats (eje limitado; valores exactos en tabla~\ref {tab:carga})}{figure.7.2}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {7.3}{\ignorespaces Throughput observado en health liveness (no equivale a PDFs/h).}}{14}{figure.7.3}\protected@file@percent }
\newlabel{fig:throughput}{{7.3}{14}{Throughput observado en health liveness (no equivale a PDFs/h)}{figure.7.3}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {8}Capacidad: 100\,000 facturas al mes}{15}{chapter.8}\protected@file@percent }
\newlabel{ch:carga}{{7}{14}{Resultados --- pruebas de carga}{chapter.7}{}}
\@writefile{toc}{\contentsline {section}{\numberline {7.1}Tabla consolidada}{14}{section.7.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {7.1}{\ignorespaces M\'etricas de carga k6 (perfil shared8g).}}{14}{table.7.1}\protected@file@percent }
\newlabel{tab:carga}{{7.1}{14}{M\'etricas de carga k6 (perfil shared8g)}{table.7.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {7.2}ST-GW-01}{14}{section.7.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.3}ST-BOT-01 --- comparativa}{14}{section.7.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {7.4}Throughput gateway}{14}{section.7.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {7.1}{\ignorespaces p95 y max por caso. BOT1-max (23\,s) fuera de escala visual relativa --- ver tabla.}}{15}{figure.7.1}\protected@file@percent }
\newlabel{fig:latencias}{{7.1}{15}{p95 y max por caso. BOT1-max (23\,s) fuera de escala visual relativa --- ver tabla}{figure.7.1}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {7.2}{\ignorespaces Before/after heartbeats (eje limitado; valores exactos en tabla~\ref {tab:carga}).}}{15}{figure.7.2}\protected@file@percent }
\newlabel{fig:bot-before-after}{{7.2}{15}{Before/after heartbeats (eje limitado; valores exactos en tabla~\ref {tab:carga})}{figure.7.2}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {7.3}{\ignorespaces Throughput observado en health liveness (no equivale a PDFs/h).}}{15}{figure.7.3}\protected@file@percent }
\newlabel{fig:throughput}{{7.3}{15}{Throughput observado en health liveness (no equivale a PDFs/h)}{figure.7.3}{}}
\@writefile{toc}{\contentsline {chapter}{\numberline {8}Capacidad: 100\,000 facturas al mes}{16}{chapter.8}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:capacidad}{{8}{15}{Capacidad: 100\,000 facturas al mes}{chapter.8}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.1}Traducci\'on del objetivo}{15}{section.8.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {8.1}{\ignorespaces Throughput m\'inimo para cumplir 100k/mes.}}{15}{table.8.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8.2}Modelo por etapa}{15}{section.8.2}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {8.2}{\ignorespaces Facturas/hora estimadas. $^{*}$Sujeto a cuota LLM. $^{\dagger }$Con $N$ agents en paralelo.}}{15}{table.8.2}\protected@file@percent }
\newlabel{tab:capacidad}{{8.2}{15}{Facturas/hora estimadas. $^{*}$Sujeto a cuota LLM. $^{\dagger }$Con $N$ agents en paralelo}{table.8.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.3}Interpretaci\'on}{15}{section.8.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {8.1}{\ignorespaces Brecha de capacidad. Gateway real $\gg $1000/h; se trunca para legibilidad.}}{16}{figure.8.1}\protected@file@percent }
\newlabel{fig:capacidad}{{8.1}{16}{Brecha de capacidad. Gateway real $\gg $1000/h; se trunca para legibilidad}{figure.8.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.4}Veredicto}{16}{section.8.4}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8.5}Requisitos m\'inimos sugeridos para 100k/mes}{16}{section.8.5}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {9}An\'alisis y hallazgos}{17}{chapter.9}\protected@file@percent }
\newlabel{ch:capacidad}{{8}{16}{Capacidad: 100\,000 facturas al mes}{chapter.8}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.1}Traducci\'on del objetivo}{16}{section.8.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {8.1}{\ignorespaces Throughput m\'inimo para cumplir 100k/mes.}}{16}{table.8.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8.2}Modelo por etapa}{16}{section.8.2}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {8.2}{\ignorespaces Facturas/hora estimadas. $^{*}$Sujeto a cuota LLM. $^{\dagger }$Con $N$ agents en paralelo.}}{16}{table.8.2}\protected@file@percent }
\newlabel{tab:capacidad}{{8.2}{16}{Facturas/hora estimadas. $^{*}$Sujeto a cuota LLM. $^{\dagger }$Con $N$ agents en paralelo}{table.8.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.3}Interpretaci\'on}{16}{section.8.3}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {8.1}{\ignorespaces Brecha de capacidad. Gateway real $\gg $1000/h; se trunca para legibilidad.}}{17}{figure.8.1}\protected@file@percent }
\newlabel{fig:capacidad}{{8.1}{17}{Brecha de capacidad. Gateway real $\gg $1000/h; se trunca para legibilidad}{figure.8.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {8.4}Veredicto}{17}{section.8.4}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {8.5}Requisitos m\'inimos sugeridos para 100k/mes}{17}{section.8.5}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {9}An\'alisis y hallazgos}{18}{chapter.9}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:analisis}{{9}{17}{An\'alisis y hallazgos}{chapter.9}{}}
\@writefile{toc}{\contentsline {section}{\numberline {9.1}Hallazgos}{17}{section.9.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {9.2}Scorecard global}{17}{section.9.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {9.1}{\ignorespaces Distribuci\'on de resultados por tipo de prueba.}}{17}{figure.9.1}\protected@file@percent }
\newlabel{fig:scorecard}{{9.1}{17}{Distribuci\'on de resultados por tipo de prueba}{figure.9.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {9.3}Limitaciones}{17}{section.9.3}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {10}Conclusiones y recomendaciones}{18}{chapter.10}\protected@file@percent }
\newlabel{ch:analisis}{{9}{18}{An\'alisis y hallazgos}{chapter.9}{}}
\@writefile{toc}{\contentsline {section}{\numberline {9.1}Hallazgos}{18}{section.9.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {9.2}Scorecard global}{18}{section.9.2}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {9.1}{\ignorespaces Distribuci\'on de resultados por tipo de prueba.}}{18}{figure.9.1}\protected@file@percent }
\newlabel{fig:scorecard}{{9.1}{18}{Distribuci\'on de resultados por tipo de prueba}{figure.9.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {9.3}Limitaciones}{18}{section.9.3}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {10}Conclusiones y recomendaciones}{19}{chapter.10}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:conclusiones}{{10}{18}{Conclusiones y recomendaciones}{chapter.10}{}}
\@writefile{toc}{\contentsline {section}{\numberline {10.1}Conclusiones}{18}{section.10.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {10.2}Recomendaciones}{18}{section.10.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {10.3}Pr\'oxima campa\~na sugerida}{18}{section.10.3}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {11}Anexos}{19}{chapter.11}\protected@file@percent }
\newlabel{ch:conclusiones}{{10}{19}{Conclusiones y recomendaciones}{chapter.10}{}}
\@writefile{toc}{\contentsline {section}{\numberline {10.1}Conclusiones}{19}{section.10.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {10.2}Recomendaciones}{19}{section.10.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {10.3}Pr\'oxima campa\~na sugerida}{19}{section.10.3}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {11}Anexos}{20}{chapter.11}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:anexos}{{11}{19}{Anexos}{chapter.11}{}}
\@writefile{toc}{\contentsline {section}{\numberline {11.1}Datos fuente}{19}{section.11.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.2}Extracto ST-GW-01}{19}{section.11.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.3}Extracto ST-BOT-01 \#2}{19}{section.11.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.4}Unitarias}{19}{section.11.4}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.5}Scripts}{19}{section.11.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.6}Reproducibilidad}{20}{section.11.6}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {12}Resultados --- latencia count-api (PDFs reales)}{21}{chapter.12}\protected@file@percent }
\newlabel{ch:anexos}{{11}{20}{Anexos}{chapter.11}{}}
\@writefile{toc}{\contentsline {section}{\numberline {11.1}Datos fuente}{20}{section.11.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.2}Extracto ST-GW-01}{20}{section.11.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.3}Extracto ST-BOT-01 \#2}{20}{section.11.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.4}Unitarias}{20}{section.11.4}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.5}Scripts}{20}{section.11.5}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {11.6}Reproducibilidad}{21}{section.11.6}\protected@file@percent }
\@writefile{toc}{\contentsline {chapter}{\numberline {12}Count-api: qu\'e eval\'ua cada prueba}{22}{chapter.12}\protected@file@percent }
\@writefile{lof}{\addvspace {10\p@ }}
\@writefile{lot}{\addvspace {10\p@ }}
\newlabel{ch:count-latency}{{12}{21}{Resultados --- latencia count-api (PDFs reales)}{chapter.12}{}}
\@writefile{toc}{\contentsline {section}{\numberline {12.1}Fixtures}{21}{section.12.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {12.2}Unitarias pipeline ampliadas}{21}{section.12.2}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {12.3}Timings por etapa}{21}{section.12.3}\protected@file@percent }
\@writefile{lol}{\contentsline {lstlisting}{\numberline {12.1}Medici\'on en Ubuntu}{21}{lstlisting.12.1}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {12.1}{\ignorespaces Latencia por etapa (ms). Completar tras \texttt {-run Timing} en el host con Tesseract.}}{22}{table.12.1}\protected@file@percent }
\newlabel{tab:count-timing}{{12.1}{22}{Latencia por etapa (ms). Completar tras \texttt {-run Timing} en el host con Tesseract}{table.12.1}{}}
\gdef \@abspage@last{23}
\newlabel{ch:count-latency}{{12}{22}{Count-api: qu\'e eval\'ua cada prueba}{chapter.12}{}}
\@writefile{toc}{\contentsline {section}{\numberline {12.1}Pipeline bajo prueba}{22}{section.12.1}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {12.2}Resultado global count-api}{22}{section.12.2}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {12.1}{\ignorespaces Scorecard count-api en esta campa\~na.}}{22}{table.12.1}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {12.1}{\ignorespaces Cobertura count-api por bloque.}}{22}{figure.12.1}\protected@file@percent }
\newlabel{fig:count-score}{{12.1}{22}{Cobertura count-api por bloque}{figure.12.1}{}}
\@writefile{toc}{\contentsline {section}{\numberline {12.3}Features: qu\'e se eval\'ua (con ejemplo)}{23}{section.12.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.1}TestExtractRowFeaturesServiceTablePattern --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.2}TestBuildFeaturesContinuation --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.3}TestExtractRowFeaturesHeaderKeyword --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.4}TestExtractRowFeaturesServiceCode --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.5}TestExtractRowFeaturesNoTablePattern --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.6}TestBuildFeatureRowsEmpty --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.6}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.3.7}TestFeatureCount --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.7}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {12.4}Clustering: qu\'e se eval\'ua (con ejemplo)}{24}{section.12.4}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.4.1}TestClusterRowsTwoBands --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.4.2}TestClusterRowsSameBand --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.4.3}TestClusterRowsEmpty --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.3}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.4.4}TestClusterRowsNoiseMinSamples --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.4}\protected@file@percent }
\@writefile{lof}{\contentsline {figure}{\numberline {12.2}{\ignorespaces Ilustraci\'on del test de dos bandas (no son coordenadas OCR reales).}}{24}{figure.12.2}\protected@file@percent }
\newlabel{fig:cluster-idea}{{12.2}{24}{Ilustraci\'on del test de dos bandas (no son coordenadas OCR reales)}{figure.12.2}{}}
\@writefile{toc}{\contentsline {section}{\numberline {12.5}Pruebas con PDFs reales}{24}{section.12.5}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.5.1}Fixtures}{24}{subsection.12.5.1}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.5.2}TestProcessPDFTimingFixtures}{25}{subsection.12.5.2}\protected@file@percent }
\@writefile{toc}{\contentsline {subsection}{\numberline {12.5.3}Script HTTP \texttt {measure\_count\_latency}}{25}{subsection.12.5.3}\protected@file@percent }
\@writefile{toc}{\contentsline {section}{\numberline {12.6}Resultados de latencia HTTP (medidos)}{25}{section.12.6}\protected@file@percent }
\@writefile{lot}{\contentsline {table}{\numberline {12.2}{\ignorespaces Wall-clock HTTP. Fuente: \texttt {informes/count\_latency\_20260713.csv}.}}{25}{table.12.2}\protected@file@percent }
\newlabel{tab:count-http}{{12.2}{25}{Wall-clock HTTP. Fuente: \texttt {informes/count\_latency\_20260713.csv}}{table.12.2}{}}
\@writefile{lof}{\contentsline {figure}{\numberline {12.3}{\ignorespaces Barras: tiempo por PDF. L\'inea naranja: promedio 2{,}98\,s.}}{25}{figure.12.3}\protected@file@percent }
\newlabel{fig:count-http-bars}{{12.3}{25}{Barras: tiempo por PDF. L\'inea naranja: promedio 2{,}98\,s}{figure.12.3}{}}
\@writefile{toc}{\contentsline {section}{\numberline {12.7}C\'omo reproducir}{25}{section.12.7}\protected@file@percent }
\gdef \@abspage@last{27}
+22 -4
View File
@@ -52,7 +52,25 @@
\BOOKMARK [1][-]{section.11.4}{\376\377\000U\000n\000i\000t\000a\000r\000i\000a\000s}{chapter.11}% 52
\BOOKMARK [1][-]{section.11.5}{\376\377\000S\000c\000r\000i\000p\000t\000s}{chapter.11}% 53
\BOOKMARK [1][-]{section.11.6}{\376\377\000R\000e\000p\000r\000o\000d\000u\000c\000i\000b\000i\000l\000i\000d\000a\000d}{chapter.11}% 54
\BOOKMARK [0][-]{chapter.12}{\376\377\000R\000e\000s\000u\000l\000t\000a\000d\000o\000s\000\040\040\024\000\040\000l\000a\000t\000e\000n\000c\000i\000a\000\040\000c\000o\000u\000n\000t\000-\000a\000p\000i\000\040\000\050\000P\000D\000F\000s\000\040\000r\000e\000a\000l\000e\000s\000\051}{}% 55
\BOOKMARK [1][-]{section.12.1}{\376\377\000F\000i\000x\000t\000u\000r\000e\000s}{chapter.12}% 56
\BOOKMARK [1][-]{section.12.2}{\376\377\000U\000n\000i\000t\000a\000r\000i\000a\000s\000\040\000p\000i\000p\000e\000l\000i\000n\000e\000\040\000a\000m\000p\000l\000i\000a\000d\000a\000s}{chapter.12}% 57
\BOOKMARK [1][-]{section.12.3}{\376\377\000T\000i\000m\000i\000n\000g\000s\000\040\000p\000o\000r\000\040\000e\000t\000a\000p\000a}{chapter.12}% 58
\BOOKMARK [0][-]{chapter.12}{\376\377\000C\000o\000u\000n\000t\000-\000a\000p\000i\000:\000\040\000q\000u\000\351\000\040\000e\000v\000a\000l\000\372\000a\000\040\000c\000a\000d\000a\000\040\000p\000r\000u\000e\000b\000a}{}% 55
\BOOKMARK [1][-]{section.12.1}{\376\377\000P\000i\000p\000e\000l\000i\000n\000e\000\040\000b\000a\000j\000o\000\040\000p\000r\000u\000e\000b\000a}{chapter.12}% 56
\BOOKMARK [1][-]{section.12.2}{\376\377\000R\000e\000s\000u\000l\000t\000a\000d\000o\000\040\000g\000l\000o\000b\000a\000l\000\040\000c\000o\000u\000n\000t\000-\000a\000p\000i}{chapter.12}% 57
\BOOKMARK [1][-]{section.12.3}{\376\377\000F\000e\000a\000t\000u\000r\000e\000s\000:\000\040\000q\000u\000\351\000\040\000s\000e\000\040\000e\000v\000a\000l\000\372\000a\000\040\000\050\000c\000o\000n\000\040\000e\000j\000e\000m\000p\000l\000o\000\051}{chapter.12}% 58
\BOOKMARK [2][-]{subsection.12.3.1}{\376\377\000T\000e\000s\000t\000E\000x\000t\000r\000a\000c\000t\000R\000o\000w\000F\000e\000a\000t\000u\000r\000e\000s\000S\000e\000r\000v\000i\000c\000e\000T\000a\000b\000l\000e\000P\000a\000t\000t\000e\000r\000n\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 59
\BOOKMARK [2][-]{subsection.12.3.2}{\376\377\000T\000e\000s\000t\000B\000u\000i\000l\000d\000F\000e\000a\000t\000u\000r\000e\000s\000C\000o\000n\000t\000i\000n\000u\000a\000t\000i\000o\000n\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 60
\BOOKMARK [2][-]{subsection.12.3.3}{\376\377\000T\000e\000s\000t\000E\000x\000t\000r\000a\000c\000t\000R\000o\000w\000F\000e\000a\000t\000u\000r\000e\000s\000H\000e\000a\000d\000e\000r\000K\000e\000y\000w\000o\000r\000d\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 61
\BOOKMARK [2][-]{subsection.12.3.4}{\376\377\000T\000e\000s\000t\000E\000x\000t\000r\000a\000c\000t\000R\000o\000w\000F\000e\000a\000t\000u\000r\000e\000s\000S\000e\000r\000v\000i\000c\000e\000C\000o\000d\000e\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 62
\BOOKMARK [2][-]{subsection.12.3.5}{\376\377\000T\000e\000s\000t\000E\000x\000t\000r\000a\000c\000t\000R\000o\000w\000F\000e\000a\000t\000u\000r\000e\000s\000N\000o\000T\000a\000b\000l\000e\000P\000a\000t\000t\000e\000r\000n\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 63
\BOOKMARK [2][-]{subsection.12.3.6}{\376\377\000T\000e\000s\000t\000B\000u\000i\000l\000d\000F\000e\000a\000t\000u\000r\000e\000R\000o\000w\000s\000E\000m\000p\000t\000y\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 64
\BOOKMARK [2][-]{subsection.12.3.7}{\376\377\000T\000e\000s\000t\000F\000e\000a\000t\000u\000r\000e\000C\000o\000u\000n\000t\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.3}% 65
\BOOKMARK [1][-]{section.12.4}{\376\377\000C\000l\000u\000s\000t\000e\000r\000i\000n\000g\000:\000\040\000q\000u\000\351\000\040\000s\000e\000\040\000e\000v\000a\000l\000\372\000a\000\040\000\050\000c\000o\000n\000\040\000e\000j\000e\000m\000p\000l\000o\000\051}{chapter.12}% 66
\BOOKMARK [2][-]{subsection.12.4.1}{\376\377\000T\000e\000s\000t\000C\000l\000u\000s\000t\000e\000r\000R\000o\000w\000s\000T\000w\000o\000B\000a\000n\000d\000s\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.4}% 67
\BOOKMARK [2][-]{subsection.12.4.2}{\376\377\000T\000e\000s\000t\000C\000l\000u\000s\000t\000e\000r\000R\000o\000w\000s\000S\000a\000m\000e\000B\000a\000n\000d\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.4}% 68
\BOOKMARK [2][-]{subsection.12.4.3}{\376\377\000T\000e\000s\000t\000C\000l\000u\000s\000t\000e\000r\000R\000o\000w\000s\000E\000m\000p\000t\000y\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.4}% 69
\BOOKMARK [2][-]{subsection.12.4.4}{\376\377\000T\000e\000s\000t\000C\000l\000u\000s\000t\000e\000r\000R\000o\000w\000s\000N\000o\000i\000s\000e\000M\000i\000n\000S\000a\000m\000p\000l\000e\000s\000\040\040\024\000\040\000P\000A\000S\000S}{section.12.4}% 70
\BOOKMARK [1][-]{section.12.5}{\376\377\000P\000r\000u\000e\000b\000a\000s\000\040\000c\000o\000n\000\040\000P\000D\000F\000s\000\040\000r\000e\000a\000l\000e\000s}{chapter.12}% 71
\BOOKMARK [2][-]{subsection.12.5.1}{\376\377\000F\000i\000x\000t\000u\000r\000e\000s}{section.12.5}% 72
\BOOKMARK [2][-]{subsection.12.5.2}{\376\377\000T\000e\000s\000t\000P\000r\000o\000c\000e\000s\000s\000P\000D\000F\000T\000i\000m\000i\000n\000g\000F\000i\000x\000t\000u\000r\000e\000s}{section.12.5}% 73
\BOOKMARK [2][-]{subsection.12.5.3}{\376\377\000S\000c\000r\000i\000p\000t\000\040\000H\000T\000T\000P\000\040\000m\000e\000a\000s\000u\000r\000e\000\137\000c\000o\000u\000n\000t\000\137\000l\000a\000t\000e\000n\000c\000y}{section.12.5}% 74
\BOOKMARK [1][-]{section.12.6}{\376\377\000R\000e\000s\000u\000l\000t\000a\000d\000o\000s\000\040\000d\000e\000\040\000l\000a\000t\000e\000n\000c\000i\000a\000\040\000H\000T\000T\000P\000\040\000\050\000m\000e\000d\000i\000d\000o\000s\000\051}{chapter.12}% 75
\BOOKMARK [1][-]{section.12.7}{\376\377\000C\000\363\000m\000o\000\040\000r\000e\000p\000r\000o\000d\000u\000c\000i\000r}{chapter.12}% 76
+2
View File
@@ -14,6 +14,8 @@
1.0.0 & 13 jul 2026 & Informe profesional: campa\~na shared8g, m\'etricas, capacidad 100k/mes. \\
1.1.0 & 13 jul 2026 & Unitarias count-api pipeline 3/3 PASS (Ubuntu). \\
1.2.0 & 13 jul 2026 & Unitarias features/clustering ampliadas; timings PDF + scripts latencia. \\
1.3.0 & 13 jul 2026 & Latencia HTTP 3 PDFs reales (2{,}2--4{,}5\,s); fix path Timing test. \\
1.4.0 & 13 jul 2026 & Cap.\ count-api: explicaci\'on test a test, ejemplos y gr\'aficas. \\
\bottomrule
\end{tabularx}
+76 -58
View File
@@ -1,59 +1,77 @@
\babel@toc {spanish}{}\relax
\contentsline {chapter}{\numberline {1}Resumen ejecutivo}{4}{chapter.1}%
\contentsline {section}{\numberline {1.1}Veredicto global}{4}{section.1.1}%
\contentsline {section}{\numberline {1.2}KPIs de la campa\~na}{4}{section.1.2}%
\contentsline {section}{\numberline {1.3}Respuesta directa: 100\,000 facturas/mes}{4}{section.1.3}%
\contentsline {section}{\numberline {1.4}Riesgo principal}{5}{section.1.4}%
\contentsline {chapter}{\numberline {2}Objeto y alcance}{6}{chapter.2}%
\contentsline {section}{\numberline {2.1}Objeto}{6}{section.2.1}%
\contentsline {section}{\numberline {2.2}Alcance incluido}{6}{section.2.2}%
\contentsline {section}{\numberline {2.3}Fuera de alcance de esta campa\~na}{6}{section.2.3}%
\contentsline {section}{\numberline {2.4}Definici\'on de factura}{6}{section.2.4}%
\contentsline {chapter}{\numberline {3}Entorno bajo prueba}{7}{chapter.3}%
\contentsline {section}{\numberline {3.1}Hardware y sistema}{7}{section.3.1}%
\contentsline {section}{\numberline {3.2}Baseline de memoria (2026-07-13)}{7}{section.3.2}%
\contentsline {section}{\numberline {3.3}Salud del stack}{7}{section.3.3}%
\contentsline {chapter}{\numberline {4}Metodolog\'ia}{9}{chapter.4}%
\contentsline {section}{\numberline {4.1}Tipos de prueba}{9}{section.4.1}%
\contentsline {section}{\numberline {4.2}Herramientas}{9}{section.4.2}%
\contentsline {section}{\numberline {4.3}SLOs perfil \texttt {shared8g}}{9}{section.4.3}%
\contentsline {section}{\numberline {4.4}Comandos representativos}{9}{section.4.4}%
\contentsline {chapter}{\numberline {5}Resultados --- pruebas unitarias}{10}{chapter.5}%
\contentsline {section}{\numberline {5.1}Scorecard}{10}{section.5.1}%
\contentsline {section}{\numberline {5.2}Cobertura agent}{10}{section.5.2}%
\contentsline {section}{\numberline {5.3}Cobertura API store}{10}{section.5.3}%
\contentsline {section}{\numberline {5.4}Cobertura count-api}{10}{section.5.4}%
\contentsline {chapter}{\numberline {6}Resultados --- humo y funcional}{12}{chapter.6}%
\contentsline {section}{\numberline {6.1}Humo gateway}{12}{section.6.1}%
\contentsline {section}{\numberline {6.2}Funcional E2E-07 (worker offline $\rightarrow $ 409)}{12}{section.6.2}%
\contentsline {section}{\numberline {6.3}Script preparado}{12}{section.6.3}%
\contentsline {chapter}{\numberline {7}Resultados --- pruebas de carga}{13}{chapter.7}%
\contentsline {section}{\numberline {7.1}Tabla consolidada}{13}{section.7.1}%
\contentsline {section}{\numberline {7.2}ST-GW-01}{13}{section.7.2}%
\contentsline {section}{\numberline {7.3}ST-BOT-01 --- comparativa}{13}{section.7.3}%
\contentsline {section}{\numberline {7.4}Throughput gateway}{13}{section.7.4}%
\contentsline {chapter}{\numberline {8}Capacidad: 100\,000 facturas al mes}{15}{chapter.8}%
\contentsline {section}{\numberline {8.1}Traducci\'on del objetivo}{15}{section.8.1}%
\contentsline {section}{\numberline {8.2}Modelo por etapa}{15}{section.8.2}%
\contentsline {section}{\numberline {8.3}Interpretaci\'on}{15}{section.8.3}%
\contentsline {section}{\numberline {8.4}Veredicto}{16}{section.8.4}%
\contentsline {section}{\numberline {8.5}Requisitos m\'inimos sugeridos para 100k/mes}{16}{section.8.5}%
\contentsline {chapter}{\numberline {9}An\'alisis y hallazgos}{17}{chapter.9}%
\contentsline {section}{\numberline {9.1}Hallazgos}{17}{section.9.1}%
\contentsline {section}{\numberline {9.2}Scorecard global}{17}{section.9.2}%
\contentsline {section}{\numberline {9.3}Limitaciones}{17}{section.9.3}%
\contentsline {chapter}{\numberline {10}Conclusiones y recomendaciones}{18}{chapter.10}%
\contentsline {section}{\numberline {10.1}Conclusiones}{18}{section.10.1}%
\contentsline {section}{\numberline {10.2}Recomendaciones}{18}{section.10.2}%
\contentsline {section}{\numberline {10.3}Pr\'oxima campa\~na sugerida}{18}{section.10.3}%
\contentsline {chapter}{\numberline {11}Anexos}{19}{chapter.11}%
\contentsline {section}{\numberline {11.1}Datos fuente}{19}{section.11.1}%
\contentsline {section}{\numberline {11.2}Extracto ST-GW-01}{19}{section.11.2}%
\contentsline {section}{\numberline {11.3}Extracto ST-BOT-01 \#2}{19}{section.11.3}%
\contentsline {section}{\numberline {11.4}Unitarias}{19}{section.11.4}%
\contentsline {section}{\numberline {11.5}Scripts}{19}{section.11.5}%
\contentsline {section}{\numberline {11.6}Reproducibilidad}{20}{section.11.6}%
\contentsline {chapter}{\numberline {12}Resultados --- latencia count-api (PDFs reales)}{21}{chapter.12}%
\contentsline {section}{\numberline {12.1}Fixtures}{21}{section.12.1}%
\contentsline {section}{\numberline {12.2}Unitarias pipeline ampliadas}{21}{section.12.2}%
\contentsline {section}{\numberline {12.3}Timings por etapa}{21}{section.12.3}%
\contentsline {chapter}{\numberline {1}Resumen ejecutivo}{5}{chapter.1}%
\contentsline {section}{\numberline {1.1}Veredicto global}{5}{section.1.1}%
\contentsline {section}{\numberline {1.2}KPIs de la campa\~na}{5}{section.1.2}%
\contentsline {section}{\numberline {1.3}Respuesta directa: 100\,000 facturas/mes}{5}{section.1.3}%
\contentsline {section}{\numberline {1.4}Riesgo principal}{6}{section.1.4}%
\contentsline {chapter}{\numberline {2}Objeto y alcance}{7}{chapter.2}%
\contentsline {section}{\numberline {2.1}Objeto}{7}{section.2.1}%
\contentsline {section}{\numberline {2.2}Alcance incluido}{7}{section.2.2}%
\contentsline {section}{\numberline {2.3}Fuera de alcance de esta campa\~na}{7}{section.2.3}%
\contentsline {section}{\numberline {2.4}Definici\'on de factura}{7}{section.2.4}%
\contentsline {chapter}{\numberline {3}Entorno bajo prueba}{8}{chapter.3}%
\contentsline {section}{\numberline {3.1}Hardware y sistema}{8}{section.3.1}%
\contentsline {section}{\numberline {3.2}Baseline de memoria (2026-07-13)}{8}{section.3.2}%
\contentsline {section}{\numberline {3.3}Salud del stack}{8}{section.3.3}%
\contentsline {chapter}{\numberline {4}Metodolog\'ia}{10}{chapter.4}%
\contentsline {section}{\numberline {4.1}Tipos de prueba}{10}{section.4.1}%
\contentsline {section}{\numberline {4.2}Herramientas}{10}{section.4.2}%
\contentsline {section}{\numberline {4.3}SLOs perfil \texttt {shared8g}}{10}{section.4.3}%
\contentsline {section}{\numberline {4.4}Comandos representativos}{10}{section.4.4}%
\contentsline {chapter}{\numberline {5}Resultados --- pruebas unitarias}{11}{chapter.5}%
\contentsline {section}{\numberline {5.1}Scorecard}{11}{section.5.1}%
\contentsline {section}{\numberline {5.2}Cobertura agent}{11}{section.5.2}%
\contentsline {section}{\numberline {5.3}Cobertura API store}{11}{section.5.3}%
\contentsline {section}{\numberline {5.4}Cobertura count-api}{11}{section.5.4}%
\contentsline {chapter}{\numberline {6}Resultados --- humo y funcional}{13}{chapter.6}%
\contentsline {section}{\numberline {6.1}Humo gateway}{13}{section.6.1}%
\contentsline {section}{\numberline {6.2}Funcional E2E-07 (worker offline $\rightarrow $ 409)}{13}{section.6.2}%
\contentsline {section}{\numberline {6.3}Script preparado}{13}{section.6.3}%
\contentsline {chapter}{\numberline {7}Resultados --- pruebas de carga}{14}{chapter.7}%
\contentsline {section}{\numberline {7.1}Tabla consolidada}{14}{section.7.1}%
\contentsline {section}{\numberline {7.2}ST-GW-01}{14}{section.7.2}%
\contentsline {section}{\numberline {7.3}ST-BOT-01 --- comparativa}{14}{section.7.3}%
\contentsline {section}{\numberline {7.4}Throughput gateway}{14}{section.7.4}%
\contentsline {chapter}{\numberline {8}Capacidad: 100\,000 facturas al mes}{16}{chapter.8}%
\contentsline {section}{\numberline {8.1}Traducci\'on del objetivo}{16}{section.8.1}%
\contentsline {section}{\numberline {8.2}Modelo por etapa}{16}{section.8.2}%
\contentsline {section}{\numberline {8.3}Interpretaci\'on}{16}{section.8.3}%
\contentsline {section}{\numberline {8.4}Veredicto}{17}{section.8.4}%
\contentsline {section}{\numberline {8.5}Requisitos m\'inimos sugeridos para 100k/mes}{17}{section.8.5}%
\contentsline {chapter}{\numberline {9}An\'alisis y hallazgos}{18}{chapter.9}%
\contentsline {section}{\numberline {9.1}Hallazgos}{18}{section.9.1}%
\contentsline {section}{\numberline {9.2}Scorecard global}{18}{section.9.2}%
\contentsline {section}{\numberline {9.3}Limitaciones}{18}{section.9.3}%
\contentsline {chapter}{\numberline {10}Conclusiones y recomendaciones}{19}{chapter.10}%
\contentsline {section}{\numberline {10.1}Conclusiones}{19}{section.10.1}%
\contentsline {section}{\numberline {10.2}Recomendaciones}{19}{section.10.2}%
\contentsline {section}{\numberline {10.3}Pr\'oxima campa\~na sugerida}{19}{section.10.3}%
\contentsline {chapter}{\numberline {11}Anexos}{20}{chapter.11}%
\contentsline {section}{\numberline {11.1}Datos fuente}{20}{section.11.1}%
\contentsline {section}{\numberline {11.2}Extracto ST-GW-01}{20}{section.11.2}%
\contentsline {section}{\numberline {11.3}Extracto ST-BOT-01 \#2}{20}{section.11.3}%
\contentsline {section}{\numberline {11.4}Unitarias}{20}{section.11.4}%
\contentsline {section}{\numberline {11.5}Scripts}{20}{section.11.5}%
\contentsline {section}{\numberline {11.6}Reproducibilidad}{21}{section.11.6}%
\contentsline {chapter}{\numberline {12}Count-api: qu\'e eval\'ua cada prueba}{22}{chapter.12}%
\contentsline {section}{\numberline {12.1}Pipeline bajo prueba}{22}{section.12.1}%
\contentsline {section}{\numberline {12.2}Resultado global count-api}{22}{section.12.2}%
\contentsline {section}{\numberline {12.3}Features: qu\'e se eval\'ua (con ejemplo)}{23}{section.12.3}%
\contentsline {subsection}{\numberline {12.3.1}TestExtractRowFeaturesServiceTablePattern --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.1}%
\contentsline {subsection}{\numberline {12.3.2}TestBuildFeaturesContinuation --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.2}%
\contentsline {subsection}{\numberline {12.3.3}TestExtractRowFeaturesHeaderKeyword --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.3}%
\contentsline {subsection}{\numberline {12.3.4}TestExtractRowFeaturesServiceCode --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.4}%
\contentsline {subsection}{\numberline {12.3.5}TestExtractRowFeaturesNoTablePattern --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.5}%
\contentsline {subsection}{\numberline {12.3.6}TestBuildFeatureRowsEmpty --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.6}%
\contentsline {subsection}{\numberline {12.3.7}TestFeatureCount --- \textcolor {passgreen}{\textbf {PASS}}}{23}{subsection.12.3.7}%
\contentsline {section}{\numberline {12.4}Clustering: qu\'e se eval\'ua (con ejemplo)}{24}{section.12.4}%
\contentsline {subsection}{\numberline {12.4.1}TestClusterRowsTwoBands --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.1}%
\contentsline {subsection}{\numberline {12.4.2}TestClusterRowsSameBand --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.2}%
\contentsline {subsection}{\numberline {12.4.3}TestClusterRowsEmpty --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.3}%
\contentsline {subsection}{\numberline {12.4.4}TestClusterRowsNoiseMinSamples --- \textcolor {passgreen}{\textbf {PASS}}}{24}{subsection.12.4.4}%
\contentsline {section}{\numberline {12.5}Pruebas con PDFs reales}{24}{section.12.5}%
\contentsline {subsection}{\numberline {12.5.1}Fixtures}{24}{subsection.12.5.1}%
\contentsline {subsection}{\numberline {12.5.2}TestProcessPDFTimingFixtures}{25}{subsection.12.5.2}%
\contentsline {subsection}{\numberline {12.5.3}Script HTTP \texttt {measure\_count\_latency}}{25}{subsection.12.5.3}%
\contentsline {section}{\numberline {12.6}Resultados de latencia HTTP (medidos)}{25}{section.12.6}%
\contentsline {section}{\numberline {12.7}C\'omo reproducir}{25}{section.12.7}%
+1 -1
View File
@@ -70,7 +70,7 @@
pdfauthor={IPSExtractor QA}
}
\newcommand{\docversion}{1.2.0}
\newcommand{\docversion}{1.4.0}
\newcommand{\docdate}{13 de julio de 2026}
\newcommand{\pass}{\textcolor{passgreen}{\textbf{PASS}}}
@@ -10,11 +10,11 @@
\midrule
\texttt{bots/bot\_descarga/tests} & \pass & 19/19 & 3{,}21\,s \\
\texttt{services/bot\_descarga/tests} & \pass & 7/7 & 1{,}45\,s \\
\texttt{go test} count-api (\texttt{internal/pipeline}) & \pass$^{*}$ & 3+8 nuevos & ver Timing \\
\texttt{go test} count-api (\texttt{internal/pipeline}) & \pass & 11/11 & + Timing/HTTP en cap.~\ref{ch:count-latency} \\
Vitest desktop & \neje & --- & No ejecutado en esta sesi\'on \\
\bottomrule
\end{tabular}
\caption{Resultados unitarios. $^{*}$Base 3 PASS confirmados en Ubuntu; ampliaci\'on features/clustering (+8) y Timing sobre 3 PDFs reales requieren \texttt{go test} en host con Tesseract.}
\caption{Resultados unitarios.}
\end{table}
\section{Cobertura agent}
@@ -24,12 +24,8 @@ Incluye excel reader, PDF validator, file manager, cancel, browser fatal, MinIO
Incluye helpers MinIO, register/heartbeat/offline, claim at\'omico, cancel, events, filtros por job padre (7 casos).
\section{Cobertura count-api}
Ejecutado en Ubuntu (deps Tesseract/Leptonica):
tests originales de features (3) \pass.
Ampliaci\'on: \texttt{features\_extra\_test.go} + \texttt{clustering\_test.go} (+8 casos).
Medici\'on de documentos: \texttt{processor\_timing\_test.go} sobre
\texttt{docs/plan\_pruebas/data/*.pdf} (3 archivos); ver cap.~\ref{ch:count-latency}.
\texttt{PDFResult} ahora incluye \texttt{render\_ms}/\texttt{ocr\_ms}/\texttt{cluster\_ms}/\texttt{infer\_ms}/\texttt{total\_ms}.
Ver cap\'itulo~\ref{ch:count-latency}: explicaci\'on test a test con ejemplos,
gr\'aficas y resultados (11 unitarias PASS; HTTP 3 PDFs ok en 2{,}2--4{,}5\,s).
\begin{figure}[ht]
\centering
@@ -46,7 +42,7 @@ Medici\'on de documentos: \texttt{processor\_timing\_test.go} sobre
bar width=10pt,
legend style={at={(0.98,0.35)},anchor=east,font=\small}
]
\addplot[fill=passgreen!70] coordinates {(19,agent) (7,api-store) (3,count-api) (0,desktop)};
\addplot[fill=passgreen!70] coordinates {(19,agent) (7,api-store) (11,count-api) (0,desktop)};
\addlegendentry{PASS}
\addplot[fill=ipsgrey!40] coordinates {(0,agent) (0,api-store) (0,count-api) (1,desktop)};
\addlegendentry{N/E}
@@ -1,49 +1,244 @@
\chapter{Resultados --- latencia count-api (PDFs reales)}
\chapter{Count-api: qu\'e eval\'ua cada prueba}
\label{ch:count-latency}
\section{Fixtures}
Tres PDFs en \texttt{docs/plan\_pruebas/data/}:
Este cap\'itulo explica, con ejemplos, las pruebas del microservicio \textbf{count-api}
(conteo de servicios en facturas PDF) y resume los \textbf{resultados} obtenidos
en el host Ubuntu el 13 de julio de 2026.
\section{Pipeline bajo prueba}
\begin{center}
\begin{tikzpicture}[
font=\small,
box/.style={draw=ipsblue, rounded corners=2pt, align=center, inner sep=5pt, minimum height=0.75cm},
arr/.style={-{Latex}, thick, ipsblue}
]
\node[box, fill=codebg] (pdf) {PDF};
\node[box, right=0.45cm of pdf] (ren) {Render\\DPI};
\node[box, right=0.45cm of ren] (ocr) {OCR\\Tesseract};
\node[box, right=0.45cm of ocr] (clu) {Cluster\\Y (DBSCAN)};
\node[box, right=0.45cm of clu] (fea) {14\\features};
\node[box, right=0.45cm of fea] (ml) {ONNX /\\heur\'istica};
\draw[arr] (pdf) -- (ren);
\draw[arr] (ren) -- (ocr);
\draw[arr] (ocr) -- (clu);
\draw[arr] (clu) -- (fea);
\draw[arr] (fea) -- (ml);
\end{tikzpicture}
\end{center}
Las unitarias de \texttt{features} y \texttt{clustering} \textbf{no} abren el PDF:
simulan ``cajas'' OCR \texttt{\{texto, X, Y\}}. Timing y HTTP s\'i usan los 3 PDFs reales.
\section{Resultado global count-api}
\begin{table}[ht]
\centering
\begin{tabular}{@{}llrl@{}}
\toprule
\textbf{Bloque} & \textbf{Resultado} & \textbf{Casos} & \textbf{Notas} \\
\midrule
Features + clustering & \pass & 11/11 & Ubuntu, \texttt{go test -v} \\
HTTP 3 PDFs reales & \pass & 3/3 & 200, status ok, $\sim$2--4{,}5\,s \\
Timing Go por etapa & pendiente / skip path & --- & re-ejecutar \texttt{-run Timing -count=1} \\
\bottomrule
\end{tabular}
\caption{Scorecard count-api en esta campa\~na.}
\end{table}
\begin{figure}[ht]
\centering
\begin{tikzpicture}
\begin{axis}[
ybar,
width=0.85\textwidth,
height=5cm,
ylabel={Casos},
symbolic x coords={Features,Clustering,HTTP-PDF,Timing-Go},
xtick=data,
nodes near coords,
ymin=0, ymax=12,
bar width=14pt,
enlarge x limits=0.15,
legend style={at={(0.98,0.98)},anchor=north east,font=\small}
]
\addplot[fill=passgreen!75] coordinates {(Features,7) (Clustering,4) (HTTP-PDF,3) (Timing-Go,0)};
\addlegendentry{PASS}
\addplot[fill=ipsgrey!45] coordinates {(Features,0) (Clustering,0) (HTTP-PDF,0) (Timing-Go,1)};
\addlegendentry{Pendiente}
\end{axis}
\end{tikzpicture}
\caption{Cobertura count-api por bloque.}
\label{fig:count-score}
\end{figure}
\section{Features: qu\'e se eval\'ua (con ejemplo)}
El extractor construye un vector de \textbf{14 features} por fila (compatible con el modelo ONNX).
\'Indices relevantes en las pruebas:
\begin{center}
\small
\begin{tabular}{@{}clp{7.5cm}@{}}
\toprule
\textbf{\#} & \textbf{Nombre} & \textbf{Significado} \\
\midrule
1 & service\_code & Primer token parece c\'odigo de servicio \\
2 & table\_pattern & Fila tipo tabla (montos + enteros) \\
3 & header\_keyword & Palabras de cabecera (FACTURA, NIT, \ldots) \\
4 & currency\_at\_end & Monto al final de la fila \\
6 & continuation & Continuaci\'on de la fila de servicio anterior \\
\bottomrule
\end{tabular}
\end{center}
\subsection{TestExtractRowFeaturesServiceTablePattern --- \pass}
\textbf{Eval\'ua:} detectar una l\'inea de servicio ``de verdad'' (c\'odigo + descripci\'on + valores).
\textbf{Ejemplo de entrada (cajas simuladas):}
\begin{lstlisting}[language={}]
890701 | CONSULTA | 16,277.00 | 1 | 16,277.00
\end{lstlisting}
\textbf{Esperado:} feature[2]=1 (patr\'on tabla) y feature[4]=1 (moneda al final).
\subsection{TestBuildFeaturesContinuation --- \pass}
\textbf{Eval\'ua:} la segunda l\'inea es continuaci\'on del servicio, no un servicio nuevo.
\textbf{Ejemplo:}
\begin{lstlisting}[language={}]
Fila 1: 890701 CONSULTA 16,277.00 1 16,277.00
Fila 2: DE SEGUIMIENTO
\end{lstlisting}
\textbf{Esperado:} 2 filas; feature[6]=1 en la fila 2 (\texttt{is\_likely\_continuation}).
\subsection{TestExtractRowFeaturesHeaderKeyword --- \pass}
\textbf{Eval\'ua:} no confundir cabecera de factura con servicio.
\textbf{Ejemplo:} \texttt{FACTURA NIT 123} $\rightarrow$ feature[3]=1 (header).
\subsection{TestExtractRowFeaturesServiceCode --- \pass}
\textbf{Eval\'ua:} el primer token tipo c\'odigo alfanum\'erico (\texttt{AB12}) activa feature[1].
\subsection{TestExtractRowFeaturesNoTablePattern --- \pass}
\textbf{Eval\'ua:} texto libre (\texttt{TEXTO LIBRE}) \textbf{no} marca patr\'on de tabla (feature[2]=0).
\subsection{TestBuildFeatureRowsEmpty --- \pass}
\textbf{Eval\'ua:} sin cajas OCR $\rightarrow$ 0 filas (comportamiento seguro).
\subsection{TestFeatureCount --- \pass}
\textbf{Eval\'ua:} \texttt{FeatureCount == 14} (rompe el build si el modelo ML y el c\'odigo divergen).
\section{Clustering: qu\'e se eval\'ua (con ejemplo)}
Tras el OCR, las palabras se agrupan en \textbf{filas} con DBSCAN 1D sobre la coordenada $Y$.
\subsection{TestClusterRowsTwoBands --- \pass}
\textbf{Ejemplo:} palabras en $Y\approx 100$ y $Y\approx 300$ $\rightarrow$ \textbf{dos} clusters distintos
(dos renglones de la factura).
\subsection{TestClusterRowsSameBand --- \pass}
\textbf{Ejemplo:} $Y=50,52,54$ $\rightarrow$ \textbf{un} solo cluster (misma l\'inea visual).
\subsection{TestClusterRowsEmpty --- \pass}
\textbf{Eval\'ua:} \texttt{nil} o slice vac\'io no provoca panic.
\subsection{TestClusterRowsNoiseMinSamples --- \pass}
\textbf{Ejemplo:} con \texttt{minSamples=2}, un punto solo queda como ruido (\texttt{cluster=-1});
un par cercano forma cluster.
\begin{figure}[ht]
\centering
\begin{tikzpicture}
\begin{axis}[
width=0.9\textwidth,
height=5.2cm,
xlabel={X (simulado)},
ylabel={Y (simulado)},
title={Idea de clustering: dos bandas Y},
xmin=0, xmax=120,
ymin=0, ymax=350,
legend style={at={(0.98,0.98)},anchor=north east,font=\small},
grid=major
]
\addplot[only marks, mark=*, blue] coordinates {(10,100) (40,102) (70,101)};
\addlegendentry{Fila 1 ($Y\sim 100$)}
\addplot[only marks, mark=square*, red] coordinates {(10,300) (50,301) (80,298)};
\addlegendentry{Fila 2 ($Y\sim 300$)}
\end{axis}
\end{tikzpicture}
\caption{Ilustraci\'on del test de dos bandas (no son coordenadas OCR reales).}
\label{fig:cluster-idea}
\end{figure}
\section{Pruebas con PDFs reales}
\subsection{Fixtures}
\begin{itemize}
\item \texttt{500000284335937.pdf}
\item \texttt{500000284335940.pdf}
\item \texttt{500000284335954.pdf}
\end{itemize}
Ubicaci\'on: \texttt{docs/plan\_pruebas/data/}.
\section{Unitarias pipeline ampliadas}
Adem\'as de los 3 tests originales de features:
\begin{itemize}
\item Header keyword, service code, empty rows, no table pattern.
\item Clustering: dos bandas Y, misma banda, vac\'io, ruido \texttt{minSamples}.
\end{itemize}
Total esperado en \texttt{go test ./internal/pipeline/ -run 'TestExtract|TestBuild|TestFeature|TestCluster'}: \textbf{11} casos.
\subsection{TestProcessPDFTimingFixtures}
\textbf{Eval\'ua:} pipeline completo (render$\rightarrow$OCR$\rightarrow$cluster$\rightarrow$conteo) y que
\texttt{total\_ms $> 0$} con status ok (o reporta error). Expone ms por etapa en \texttt{PDFResult}.
\section{Timings por etapa}
El procesador expone \texttt{render\_ms}, \texttt{ocr\_ms}, \texttt{cluster\_ms}, \texttt{infer\_ms}, \texttt{total\_ms} en \texttt{PDFResult}.
\subsection{Script HTTP \texttt{measure\_count\_latency}}
\textbf{Eval\'ua:} el camino real del usuario/Desktop: gateway \texttt{POST /count/v1/count}.
\begin{lstlisting}[language=bash,caption={Medici\'on en Ubuntu}]
cd services/services-count-facturas-medicas-serving
go test ./internal/pipeline/ -run Timing -v
# HTTP v\'ia gateway:
bash docs/plan_pruebas/scripts/measure_count_latency.sh
# o PowerShell:
# .\docs\plan_pruebas\scripts\measure_count_latency.ps1
\end{lstlisting}
Los resultados de la corrida Timing/HTTP deben pegarse en
\texttt{docs/plan\_pruebas/informes/count\_latency\_YYYYMMDD.csv} y actualizar esta tabla.
\section{Resultados de latencia HTTP (medidos)}
Host \texttt{ubuntu}, gateway \texttt{127.0.0.1:8189}, 13 jul 2026:
\begin{table}[ht]
\centering
\begin{tabular}{@{}lrrrrrl@{}}
\begin{tabular}{@{}lrrll@{}}
\toprule
\textbf{PDF} & \textbf{render} & \textbf{ocr} & \textbf{cluster} & \textbf{infer} & \textbf{total} & \textbf{status} \\
\textbf{PDF} & \textbf{t (s)} & \textbf{HTTP} & \textbf{servicios} & \textbf{status} \\
\midrule
500000284335937 & --- & --- & --- & --- & --- & pendiente Ubuntu \\
500000284335940 & --- & --- & --- & --- & --- & pendiente Ubuntu \\
500000284335954 & --- & --- & --- & --- & --- & pendiente Ubuntu \\
500000284335937.pdf & 4{,}45 & 200 & 1 & ok \\
500000284335940.pdf & 2{,}29 & 200 & 1 & ok \\
500000284335954.pdf & 2{,}19 & 200 & 1 & ok \\
\midrule
Promedio & 2{,}98 & --- & --- & --- \\
M\'in / M\'ax & 2{,}19 / 4{,}45 & --- & --- & --- \\
\bottomrule
\end{tabular}
\caption{Latencia por etapa (ms). Completar tras \texttt{-run Timing} en el host con Tesseract.}
\label{tab:count-timing}
\caption{Wall-clock HTTP. Fuente: \texttt{informes/count\_latency\_20260713.csv}.}
\label{tab:count-http}
\end{table}
\begin{figure}[ht]
\centering
\begin{tikzpicture}
\begin{axis}[
ybar,
width=0.95\textwidth,
height=6cm,
ylabel={Segundos (HTTP)},
symbolic x coords={...937,...940,...954},
xtick=data,
nodes near coords,
nodes near coords style={font=\small},
ymin=0, ymax=5.5,
bar width=22pt,
enlarge x limits=0.2,
title={Tiempo de conteo por PDF (gateway)}
]
\addplot[fill=ipsblue!80] coordinates {(...937,4.45) (...940,2.29) (...954,2.19)};
\addplot[warnorange, ultra thick, sharp plot, update limits=false] coordinates {(...937,2.98) (...954,2.98)};
\end{axis}
\end{tikzpicture}
\caption{Barras: tiempo por PDF. L\'inea naranja: promedio 2{,}98\,s.}
\label{fig:count-http-bars}
\end{figure}
\textbf{Lectura:} en este host, contar \emph{una} factura tarda del orden de \textbf{2--5 segundos}
(OCR suele dominar). Extrapolaci\'on ingenua a 3\,s/PDF $\approx$ 1\,200 facturas/hora de conteo
si el nodo estuviera dedicado y sin colas --- ver cap\'itulo de capacidad 100k/mes para el contexto completo.
\section{C\'omo reproducir}
\begin{lstlisting}[language=bash]
cd services/services-count-facturas-medicas-serving
go test ./internal/pipeline/ -v -count=1
go test ./internal/pipeline/ -run Timing -v -count=1
# opcional:
export COUNT_TEST_PDF_DIR=$PWD/../../docs/plan_pruebas/data
bash docs/plan_pruebas/scripts/measure_count_latency.sh
\end{lstlisting}
@@ -0,0 +1,4 @@
file,http_time_s,http_code,service_count,status
500000284335937.pdf,4.449556,200,1,ok
500000284335940.pdf,2.290720,200,1,ok
500000284335954.pdf,2.190165,200,1,ok
1 file http_time_s http_code service_count status
2 500000284335937.pdf 4.449556 200 1 ok
3 500000284335940.pdf 2.290720 200 1 ok
4 500000284335954.pdf 2.190165 200 1 ok