Cómo se arma un informe reproducible: mismos datos, mismo resultado
Dos corridas sobre el mismo corte deberían coincidir byte a byte. Cuando no coinciden, la causa suele estar en el orden, el formato o el reloj, y no en la fuente.
Por Marco Ferreiro ·
Un informe de multas no es una foto: es el resultado de aplicar reglas a un conjunto de respuestas. Cuando dos corridas parten de las mismas respuestas y producen archivos distintos, la diferencia no la introdujo el organismo. La introdujimos nosotros.
Un informe reproducible es el que cierra esa brecha. La promesa tiene un alcance chico y por eso se puede cumplir: no dice que la deuda de mañana vaya a ser la de hoy, ni que un portal publique siempre lo mismo. Dice que, fijado el corte, el armado no agrega variación propia.
La distinción aparece apenas alguien compara dos informes de la misma patente con días de diferencia y quiere saber qué cambió.
El corte es la mitad del informe
Un corte declara qué se consultó, con qué catálogo de fuentes, hasta qué momento y qué contestó cada fuente. Sin esas cuatro piezas, “los mismos datos” es una frase sin referente: cada lector la completa con lo que supone.
La cuarta es la que más se olvida. Una fuente que no respondió no equivale a una fuente sin deuda, y esa diferencia va en la fila, no en una aclaración al pie; el tema tiene nota propia.
El catálogo también lleva versión: una URL puede seguir igual mientras la jurisdicción incorporó otra base, y un informe viejo sólo se interpreta con la cobertura vigente en su fecha.
Dónde se cuela el azar
Fijado el corte, el resto del trabajo es nuestro. Ahí entran variaciones que no vienen de ninguna fuente:
- el recorrido de estructuras sin orden garantizado o de tareas concurrentes, que termina ordenando las filas según qué respuesta llegó primero;
- el formato dependiente del entorno: separador decimal, mayúsculas, acentos y criterio de comparación alfabética;
- el reloj de la máquina, cuando una fecha se toma al renderizar en lugar de venir del corte;
- el huso horario por defecto del proceso, capaz de correr un día entero una fecha sin hora.
Ninguna de las cuatro cambia los datos; todas cambian el archivo. Por eso probamos el armado con entradas congeladas: misma entrada, misma salida, o hay un defecto que corregir.
Forma canónica antes de la huella
Comparar dos informes por su huella criptográfica sólo sirve si antes se fijó cómo se escriben. La especificación de JSON define un objeto como una colección de pares sin orden, y advierte que las bibliotecas difieren en si exponen ese orden a quien las usa. Dos documentos equivalentes como datos pueden entonces diferir como texto y, por lo tanto, como huella.
Una operación criptográfica repetible necesita una forma invariante, y hay dos caminos: conservar los bytes exactos que se archivaron, o canonicalizar. Un esquema de canonicalización determinista ordena las claves y fija cómo se escriben los valores, para que datos iguales produzcan siempre los mismos bytes. Recién sobre una de esas dos formas tiene sentido publicar una huella.
Conviene separar qué prueba cada cosa. Una huella detecta que dos corridas escribieron cosas distintas; no dice que la consulta haya sido completa ni que la fuente estuviera al día. Es un detector de diferencias, no un certificado de calidad.
Qué identifica una fila y qué la ordena
Una fila no se identifica por su posición. El modelo único de acta enumera la información uniforme que debe contener —lugar, fecha y hora, circunstancias, disposición legal presuntamente infringida y funcionario actuante, entre otros datos— y en esa enumeración no hay un identificador único. Por eso la clave con la que reencontramos un acta en la corrida siguiente es compuesta: declaramos qué campos la forman y cómo se normaliza cada uno.
El orden, en cambio, es una decisión declarada y con desempate. Ordenar por fecha alcanza hasta que dos actas comparten fecha; desde ahí hace falta un segundo criterio estable, y un tercero si el segundo también empata.
Las fechas se escriben en el formato de fecha y hora para Internet, donde toda hora expresada declara su desplazamiento respecto de UTC. Una marca sin ese desplazamiento obliga a adivinar en qué zona se produjo el corte, y esa adivinanza no es reproducible.
Cuando dos corridas no coinciden
La diferencia se lee en orden. Si el corte es distinto, el informe cambió porque cambió su insumo: eso es una reejecución, y qué parte se puede reproducir meses después depende de lo que se haya archivado. Si el corte es el mismo y el contenido difiere, el defecto está en el armado. Si el corte es el mismo y sólo difieren los bytes, falta canonicalizar.
Ese triage evita dos errores caros: tratar un cambio legítimo de la fuente como falla propia, y tratar una falla propia como “así lo devolvió el portal”. Cuando cambia el método, el cambio se versiona y se explica, en lugar de reescribir en silencio el informe anterior.
Antes de entregar un informe, verificá que traiga corte, catálogo con versión, estado por fuente, fechas con huso y huella de la forma canónica. Si falta alguna de esas piezas, todavía es una foto: sirve para mirar, no para volver a producirla.
Metodología
- Alcance
- Cómo se construye un informe de infracciones para que dos corridas sobre el mismo corte devuelvan el mismo resultado. No cubre la exactitud de lo que publica cada fuente ni el valor probatorio del documento.
- Unidad de análisis
- Una corrida del informe: un conjunto de consultas, un catálogo de fuentes y un corte temporal identificados juntos.
- Cobertura
- Aplica al armado propio y a los formatos de intercambio y de fecha citados. No describe garantías de disponibilidad ni de actualización de los portales oficiales.
Limitaciones
- La reproducibilidad del armado no dice nada sobre la exactitud de lo que publicó cada fuente en ese corte.
- Una respuesta que no se archivó no se puede volver a producir: el informe se reejecuta contra la fuente vigente y deja de comparar el mismo insumo.
- Una huella detecta que dos archivos difieren; por sí sola no prueba cobertura, autoría ni fecha.
Fuentes
- RFC 8259 — The JavaScript Object Notation Data Interchange Format — RFC Editor (consultada el )
- RFC 8785 JSON Canonicalization Scheme — RFC Editor (consultada el )
- RFC 3339 — Date and Time on the Internet — RFC Editor (consultada el )
- Acta única de infracción — Agencia Nacional de Seguridad Vial (consultada el )
Preguntas frecuentes
¿Un informe reproducible garantiza que la deuda no cambie?
No. Garantiza que, con el mismo corte, el armado devuelve el mismo resultado. Lo que publique cada organismo puede cambiar entre una consulta y otra, y esa variación pertenece a la fuente, no al informe.
¿Por qué dos informes con los mismos datos pueden tener huellas distintas?
Porque la huella se calcula sobre bytes. Dos archivos equivalentes como datos pueden escribirse distinto —otro orden de claves, otro formato de número— y arrojar huellas diferentes. Por eso se serializa en forma canónica antes de comparar.
¿Qué reviso si repito el informe y aparece una multa que antes no estaba?
Compará primero los cortes. Si el catálogo, el alcance o el momento son distintos, es una corrida nueva sobre otro insumo. Si el corte es idéntico y el contenido cambió, el problema está en el armado y hay que reproducirlo con entradas congeladas.
Notas relacionadas
Qué parte de una consulta se puede reproducir meses después
Código y catálogos versionados pueden repetirse; una respuesta externa mutable, no siempre. Snapshots, hashes y procedencia separan reproducción de simple reejecución.
Cuando corregimos una estadística: cómo versionamos el cambio
Corregir un porcentaje no debería borrar el anterior. Un registro con muestra, consulta, motivo, impacto y hashes permite ver qué cambió y si la conclusión todavía se sostiene.
Respuesta reutilizada o consulta fresca: qué marca debe ver el usuario
Una respuesta puede abrirse hoy sin haber sido obtenida hoy. Una etiqueta clara debe separar el momento de consulta, la antigüedad del resultado y la fuente que respondió.