diff --git a/.gitignore b/.gitignore index fea98c9..868f935 100644 --- a/.gitignore +++ b/.gitignore @@ -215,6 +215,7 @@ pyrightconfig.json !docs/plan_pruebas/data/ !docs/plan_pruebas/data/*.pdf *.csv +!docs/plan_pruebas/informes/*.csv *.json !services/desktop_app/package.json !services/desktop_app/package-lock.json diff --git a/docs/plan_pruebas/data/500000284335956.pdf b/docs/plan_pruebas/data/500000284335956.pdf new file mode 100644 index 0000000..e0d5d24 Binary files /dev/null and b/docs/plan_pruebas/data/500000284335956.pdf differ diff --git a/docs/plan_pruebas/data/500000284335963.pdf b/docs/plan_pruebas/data/500000284335963.pdf new file mode 100644 index 0000000..63fc1d7 Binary files /dev/null and b/docs/plan_pruebas/data/500000284335963.pdf differ diff --git a/docs/plan_pruebas/data/500000284335964.pdf b/docs/plan_pruebas/data/500000284335964.pdf new file mode 100644 index 0000000..2201f2e Binary files /dev/null and b/docs/plan_pruebas/data/500000284335964.pdf differ diff --git a/docs/plan_pruebas/data/500000284335968.pdf b/docs/plan_pruebas/data/500000284335968.pdf new file mode 100644 index 0000000..0d83b5e Binary files /dev/null and b/docs/plan_pruebas/data/500000284335968.pdf differ diff --git a/docs/plan_pruebas/data/500000284335997.pdf b/docs/plan_pruebas/data/500000284335997.pdf new file mode 100644 index 0000000..fa01027 Binary files /dev/null and b/docs/plan_pruebas/data/500000284335997.pdf differ diff --git a/docs/plan_pruebas/data/500000284336071.pdf b/docs/plan_pruebas/data/500000284336071.pdf new file mode 100644 index 0000000..ee31408 Binary files /dev/null and b/docs/plan_pruebas/data/500000284336071.pdf differ diff --git a/docs/plan_pruebas/data/500000284336521.pdf b/docs/plan_pruebas/data/500000284336521.pdf new file mode 100644 index 0000000..849ee48 Binary files /dev/null and b/docs/plan_pruebas/data/500000284336521.pdf differ diff --git a/docs/plan_pruebas/data/500000284336836.pdf b/docs/plan_pruebas/data/500000284336836.pdf new file mode 100644 index 0000000..4a8ef4f Binary files /dev/null and b/docs/plan_pruebas/data/500000284336836.pdf differ diff --git a/docs/plan_pruebas/data/500000284336915.pdf b/docs/plan_pruebas/data/500000284336915.pdf new file mode 100644 index 0000000..3934f19 Binary files /dev/null and b/docs/plan_pruebas/data/500000284336915.pdf differ diff --git a/docs/plan_pruebas/data/500000284337016.pdf b/docs/plan_pruebas/data/500000284337016.pdf new file mode 100644 index 0000000..7a3ba15 Binary files /dev/null and b/docs/plan_pruebas/data/500000284337016.pdf differ diff --git a/docs/plan_pruebas/data/500000284337418.pdf b/docs/plan_pruebas/data/500000284337418.pdf new file mode 100644 index 0000000..90a670e Binary files /dev/null and b/docs/plan_pruebas/data/500000284337418.pdf differ diff --git a/docs/plan_pruebas/data/500000284337861.pdf b/docs/plan_pruebas/data/500000284337861.pdf new file mode 100644 index 0000000..c3b8131 Binary files /dev/null and b/docs/plan_pruebas/data/500000284337861.pdf differ diff --git a/docs/plan_pruebas/data/500000284338027.pdf b/docs/plan_pruebas/data/500000284338027.pdf new file mode 100644 index 0000000..abeea63 Binary files /dev/null and b/docs/plan_pruebas/data/500000284338027.pdf differ diff --git a/docs/plan_pruebas/data/500000284338092.pdf b/docs/plan_pruebas/data/500000284338092.pdf new file mode 100644 index 0000000..c6e30b2 Binary files /dev/null and b/docs/plan_pruebas/data/500000284338092.pdf differ diff --git a/docs/plan_pruebas/data/500000284338214.pdf b/docs/plan_pruebas/data/500000284338214.pdf new file mode 100644 index 0000000..b40158d Binary files /dev/null and b/docs/plan_pruebas/data/500000284338214.pdf differ diff --git a/docs/plan_pruebas/data/500000284338327.pdf b/docs/plan_pruebas/data/500000284338327.pdf new file mode 100644 index 0000000..109e13c Binary files /dev/null and b/docs/plan_pruebas/data/500000284338327.pdf differ diff --git a/docs/plan_pruebas/data/500000284338353.pdf b/docs/plan_pruebas/data/500000284338353.pdf new file mode 100644 index 0000000..e7f9e20 Binary files /dev/null and b/docs/plan_pruebas/data/500000284338353.pdf differ diff --git a/docs/plan_pruebas/data/500000284338458.pdf b/docs/plan_pruebas/data/500000284338458.pdf new file mode 100644 index 0000000..22229d4 Binary files /dev/null and b/docs/plan_pruebas/data/500000284338458.pdf differ diff --git a/docs/plan_pruebas/data/500000284338503.pdf b/docs/plan_pruebas/data/500000284338503.pdf new file mode 100644 index 0000000..6ba4e01 Binary files /dev/null and b/docs/plan_pruebas/data/500000284338503.pdf differ diff --git a/docs/plan_pruebas/data/500000284338624.pdf b/docs/plan_pruebas/data/500000284338624.pdf new file mode 100644 index 0000000..553932d Binary files /dev/null and b/docs/plan_pruebas/data/500000284338624.pdf differ diff --git a/docs/plan_pruebas/informe/main.aux b/docs/plan_pruebas/informe/main.aux index 7b3bee6..f3356c1 100644 --- a/docs/plan_pruebas/informe/main.aux +++ b/docs/plan_pruebas/informe/main.aux @@ -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} diff --git a/docs/plan_pruebas/informe/main.out b/docs/plan_pruebas/informe/main.out index 0cc7a3a..305cf5d 100644 --- a/docs/plan_pruebas/informe/main.out +++ b/docs/plan_pruebas/informe/main.out @@ -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 diff --git a/docs/plan_pruebas/informe/main.tex b/docs/plan_pruebas/informe/main.tex index 609f13c..bd5462b 100644 --- a/docs/plan_pruebas/informe/main.tex +++ b/docs/plan_pruebas/informe/main.tex @@ -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} diff --git a/docs/plan_pruebas/informe/main.toc b/docs/plan_pruebas/informe/main.toc index a70fcd9..9c8551c 100644 --- a/docs/plan_pruebas/informe/main.toc +++ b/docs/plan_pruebas/informe/main.toc @@ -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}% diff --git a/docs/plan_pruebas/informe/preamble.tex b/docs/plan_pruebas/informe/preamble.tex index fee6653..0070f03 100644 --- a/docs/plan_pruebas/informe/preamble.tex +++ b/docs/plan_pruebas/informe/preamble.tex @@ -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}}} diff --git a/docs/plan_pruebas/informe/sections/05_resultados_unitarias.tex b/docs/plan_pruebas/informe/sections/05_resultados_unitarias.tex index 0c3b8c1..97e8fa2 100644 --- a/docs/plan_pruebas/informe/sections/05_resultados_unitarias.tex +++ b/docs/plan_pruebas/informe/sections/05_resultados_unitarias.tex @@ -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} diff --git a/docs/plan_pruebas/informe/sections/12_count_latency.tex b/docs/plan_pruebas/informe/sections/12_count_latency.tex index c255b6c..ead1bf0 100644 --- a/docs/plan_pruebas/informe/sections/12_count_latency.tex +++ b/docs/plan_pruebas/informe/sections/12_count_latency.tex @@ -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} diff --git a/docs/plan_pruebas/informes/count_latency_20260713.csv b/docs/plan_pruebas/informes/count_latency_20260713.csv new file mode 100644 index 0000000..aad73e0 --- /dev/null +++ b/docs/plan_pruebas/informes/count_latency_20260713.csv @@ -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 diff --git a/services/services-count-facturas-medicas-serving/internal/pipeline/processor_timing_test.go b/services/services-count-facturas-medicas-serving/internal/pipeline/processor_timing_test.go index 30bf43a..29039c1 100644 --- a/services/services-count-facturas-medicas-serving/internal/pipeline/processor_timing_test.go +++ b/services/services-count-facturas-medicas-serving/internal/pipeline/processor_timing_test.go @@ -3,6 +3,7 @@ package pipeline import ( "os" "path/filepath" + "runtime" "strings" "testing" @@ -13,20 +14,32 @@ import ( func testPDFDir(t *testing.T) string { t.Helper() if d := os.Getenv("COUNT_TEST_PDF_DIR"); d != "" { - return d - } - // services/services-count-facturas-medicas-serving → docs/plan_pruebas/data - candidates := []string{ - filepath.Join("..", "..", "..", "..", "docs", "plan_pruebas", "data"), - filepath.Join("..", "..", "..", "docs", "plan_pruebas", "data"), - } - for _, c := range candidates { - abs, err := filepath.Abs(c) - if err != nil { - continue + if st, err := os.Stat(d); err == nil && st.IsDir() { + return d } - if st, err := os.Stat(abs); err == nil && st.IsDir() { - return abs + t.Fatalf("COUNT_TEST_PDF_DIR=%s not a directory", d) + } + + var starts []string + if _, file, _, ok := runtime.Caller(0); ok { + starts = append(starts, filepath.Dir(file)) + } + if wd, err := os.Getwd(); err == nil { + starts = append(starts, wd) + } + + for _, start := range starts { + dir := start + for i := 0; i < 8; i++ { + candidate := filepath.Join(dir, "docs", "plan_pruebas", "data") + if st, err := os.Stat(candidate); err == nil && st.IsDir() { + return candidate + } + parent := filepath.Dir(dir) + if parent == dir { + break + } + dir = parent } } return "" @@ -54,7 +67,7 @@ func listFixturePDFs(t *testing.T, dir string) []string { func TestProcessPDFTimingFixtures(t *testing.T) { dir := testPDFDir(t) if dir == "" { - t.Skip("PDF fixtures not found; set COUNT_TEST_PDF_DIR") + t.Skip("PDF fixtures not found; set COUNT_TEST_PDF_DIR to docs/plan_pruebas/data") } pdfs := listFixturePDFs(t, dir) if len(pdfs) == 0 { @@ -68,9 +81,9 @@ func TestProcessPDFTimingFixtures(t *testing.T) { defer engine.Close() proc := NewProcessor(nil, engine, Options{ - DPI: 200, // faster than 300 for timing smoke - DBSCANEps: 10, - DBSCANMinSamples: 1, + DPI: 200, + DBSCANEps: 10, + DBSCANMinSamples: 1, LogPipelineTiming: true, })