Este documento fija los contratos minimos de entrada y salida del parser antes de modularizarlo. La meta es que los tests protejan el comportamiento actual y que cualquier cambio futuro pueda explicarse contra estos acuerdos.
Los layouts que publican el nombre completo en orden natural pueden declarar
athlete_name_order: given_family en metadata.json. Esa marca evita que la
curaduría invente la separación entre nombres y apellidos cuando la fuente no
la proporciona.
- Fuente principal: PDF de resultados FCHMN/HY-TEK.
- El parser recibe un archivo PDF y parametros operativos como
--out-dir,--competition-idy--default-source-id. - Los layouts soportados incluyen encabezados de evento en ingles y espanol, cursos
LC/SC MeteryCL/CP/CC Metro, resultados individuales y relevos. - Desde parser
0.1.12, tambien se soporta el layout brasileno "Swim It Up" detectado por watermarkSistemas de Natacao Swim It Up, con headers de evento en portugues, franjas etariasFAIXA, fechas tipo13 a 17/04/2026, individuales y relevos por columnas. - Desde parser
0.1.13, tambien se soportan PDFs HY-TEK con resultados en multiples columnas (#1 Women...) y planillasQuadathlon; estas ultimas se normalizan como cuatro pruebas canonicas 50m (butterfly,backstroke,breaststroke,freestyle) y no introducen un stroke nuevo. - Desde parser
0.1.16, los nombres de atletas y nadadores de relevo corrigen artefactos OCR acotados solo cuando hay evidencia de layout o respaldo de pruebas individuales. No se reescriben sufijos fuente comoRojas, 2. - Desde parser
0.1.17, filas HY-TEK sin seed real que terminan en puntos (... 1:22,49 1,00) deben guardar1:22,49comoresult_time_texty1,00comopoints, no como tiempo de 1 segundo. En Quadathlon, si un unico split OCR queda bajo 10 segundos y el total permite inferirlo, se reconstruye el split desde la suma del total. La misma version corrige desplazamientos deseed_timecuando un token numerico de club queda antes deNTo antes de dos tiempos reales; para pruebas de 100m o mas, un seed bajo 25 segundos se limpia en forma conservadora en vez de inferir un tiempo no observado. - En relevos HY-TEK sin seed real, los puntos finales pueden ser dobles
(
18,00,14,00,12,00,10,00). Esos tokens deben guardarse enpointsy no comoresult_time_text. - Desde parser
0.1.18, si un PDF repite exactamente la misma tabla de relevos en paginas distintas,relay_team.csvyrelay_swimmer.csvdeben conservar una sola fila operacional por equipo/nadador observado. - Desde parser
0.1.19, los relevos HY-TEK multicolumna tambien soportan integrantes sin marcadores1)/2), cuando aparecen como continuacion posicional del equipo en la misma columna, por ejemploPerez, Romulo M31 Correa, Carolina W31. - Desde parser
0.1.20, el lector HY-TEK multicolumna procesa cada pagina por columna logica completa antes de pasar a la siguiente columna. Esto evita que una linea de una columna derecha quede asociada accidentalmente al evento de otra columna, como ocurria en LQBLO 2023.
El parser debe generar CSVs con nombres estables:
club.csvevent.csvathlete.csvresult.csvrelay_team.csvrelay_swimmer.csv
Tambien puede generar archivos de trazabilidad/debug:
raw_result.csvraw_relay_team.csvraw_relay_swimmer.csvdebug_unparsed_lines.csvmetadata.json- Excel consolidado para revision manual
event.gender:women,men,mixed.athlete.gendery nadadores de relevo:female,male.event.stroke:freestyle,backstroke,breaststroke,butterfly,individual_medley,medley_relay,freestyle_relay.status:valid,dns,dnf,dsq,scratch,unknown.
metadata.jsondebe incluirpdf_name,pdf_sha256yparser_versioncuando el origen sea un PDF.seed_time_textyresult_time_textconservan la forma normalizada del tiempo o status.seed_time_msyresult_time_msse derivan cuando el tiempo es comparable.age_at_eventpertenece al resultado observado.birth_year_estimated = competition_year - age_at_eventcuando existe anio de competencia.relay_team.csvpuede incluirclub_name. Cuando existe, representa el club observado del equipo de relevo y debe preservarse hacia la carga; cuando falta o viene vacio, el pipeline puede inferir el club desdeclub.csvyrelay_team_name.- Las heuristicas propias del PDF viven en el parser; el pipeline solo debe hacer limpieza generica y carga.
- El parser normaliza sufijos de categorias de edad pegados al estilo en encabezados HY-TEK, por ejemplo
Breast 40 a 99 añosoMedley 120 a 159 años Relay, sin cambiar el canon deevent.stroke. - Desde parser
0.1.21, también reconoce relevos HY-TEK con categoría agregada al final del encabezado, por ejemploEvent 10 Women 400 SC Meter Freestyle Relay 240 a 279,Event 7 Mixed 200 SC Meter Medley C 160 a 199 años RelayoEvento 11 Mixto 200 CL Metro Combinado 120 a 159 años Relevo. - Desde parser
0.1.22, tambien reconoce encabezados Sudamericanos mixtos que combinan etiqueta espanola e ingles, por ejemploEvento 17 Mixed 72-99 4x50 SC Metros Combinado Relay. - Desde parser
0.1.24, el flujo Sudamericanos tambien normaliza estilosCI Piscina .../CI Mayores ...comoindividual_medley, acepta filas no rankeadas con--, limpia*inicial de nombres HY-TEK y omite lineas auxiliares de parciales o records que no son resultados. - Desde parser
0.1.25, en layouts Sudamericanos/Swim It Up se separan de forma conservadora los tiempos que llegan pegados al nombre de club cuando la columna de resultado viene vacia. Tambien se repara(cid:976)comofen texto extraido general, para que clubes comoDel(cid:976)inesse materialicen comoDelfinesantes de las auditorias pre-load. - Desde parser
0.1.26, los layouts Sudamericanos/Swim It Up no deben emitir nadadores de relevo conleg_orderfuera de 1..4. Las lineas posteriores al cuarto integrante, incluidos pies de pagina o nombres arrastrados por layout, no son postas cargables. - El parser puede omitir parciales/splits de carrera en
debug_unparsed_lines.csvcuando no son filas de resultado; esto evita bloquear la validacion por lineas auxiliares de HY-TEK. - Si una fila con resultado tipo status deja el tiempo de seed pegado al club, por ejemplo
Club Sparta A C 49.33 DQ DQ, el parser debe separarclub_name = Club Sparta A C,seed_time_text = 49,33yresult_time_text = DQ. - Ningun resultado
validindividual o de relevo debe materializarse conresult_time_msbajo el umbral minimo del batch runner; esos casos son evidencia de columna corrida, puntos interpretados como tiempo o OCR incompleto. - Ningun
seed_time_msindividual o de relevo bajo 25000 debe materializarse en pruebas de 100m o mas; si la fuente no permite reconstruirlo con evidencia de layout, el parser debe dejar el seed vacio. - Las filas sin posicion (
---) conDQ/DNF/DNSo marca de exhibicionXno deben conservar puntos aunque el PDF traiga un token numerico al final; ese token no representa puntaje cargable. - Los relevos no deben materializar duplicados exactos. Si la misma combinacion de evento, equipo, posta, nadador, genero y edad aparece repetida por una pagina duplicada del PDF, la salida operacional conserva solo una ocurrencia.
- En layouts multicolumna, los integrantes de relevo sin marcador explicito se asignan solo al equipo activo de esa columna y hasta completar cuatro postas; no se deben arrastrar nombres desde otro equipo, otra categoria o texto corrido de columnas vecinas.
Los fixtures versionados deben ser pequenos y representativos. No se versionan PDFs completos ni CSVs historicos completos; solo lineas o archivos minimos necesarios para prevenir regresiones.