# Verificar los agregados publicados

`verify-results.py` es autocontenido: no importa el código privado de TITAN ni requiere su snapshot. Comprueba los números de esta evaluación usando las decisiones públicas y el archivo oficial de RouterBench. **No repite la selección del router, no genera nuevas respuestas y no acredita validación independiente ni posición en un ranking.**

## 1. Preparar el entorno manualmente

Usar Python 3.11 y un entorno virtual privado. La instalación se realiza antes de ejecutar el verificador; el verificador bloquea la red y no descarga nada.

```sh
python3.11 -m venv .venv-routerbench-verify
.venv-routerbench-verify/bin/python -m pip install -r requirements-verifier.txt
```

Dependencias fijadas: NumPy 1.26.4, pandas 2.2.3 y sus dependencias transitivas enumeradas en `requirements-verifier.txt`.

## 2. Obtener los archivos

Descargar de esta publicación `verify-results.py`, `requirements-verifier.txt`, `predictions.jsonl` y `summary.json`. El corpus se descarga **directamente de su fuente oficial**, por separado; no se redistribuye aquí:

https://huggingface.co/datasets/withmartian/routerbench/resolve/784021482c3f320c6619ed4b3bb3b41a21424fcb/routerbench_0shot.pkl

SHA-256 del archivo oficial de 99.567.659 bytes:

`ba4f77f19517610a707c374e99322d7750c30fc4ae7ff5527888595a1e65d36d`

No sustituir la revisión, la variante 0-shot o los archivos de decisiones/resumen. El verificador contiene sus hashes esperados y falla si alguno cambia. La ficha del dataset no declara licencia propia; conservar el corpus localmente y consultar su fuente para los términos aplicables.

## 3. Ejecutar

```sh
.venv-routerbench-verify/bin/python verify-results.py \
  --dataset /ruta/local/routerbench_0shot.pkl \
  --predictions predictions.jsonl \
  --summary summary.json
```

Una ejecución correcta emite una sola línea JSON con `"verification":"PASS"`, 36.497 filas y 13 comparaciones. Cualquier diferencia emite `FAIL` y termina con código 1.

## Qué se comprueba

- Bytes, SHA-256 y esquema del corpus antes de deserializar con una lista restringida de globals NumPy/Pandas. No se ejecuta código upstream ni texto de respuestas.
- SHA-256 de decisiones y resumen; cantidad completa, IDs únicos, orden y hash del prompt de cada decisión.
- Selecciones dentro de los once modelos exactos y conteos de selección idénticos a los publicados.
- Calidad media continua por caso y suma de costes cacheados para TITAN, los once modelos fijos y el oráculo retrospectivo. Los cálculos se repiten localmente; no se aceptan filas faltantes, NaN, valores fuera de [0,1] para calidad ni costes negativos.
- El oráculo maximiza calidad y desempata por coste y por el orden fijo del pool, usando información retrospectiva. No representa una selección disponible por anticipado.
- Comparación de agregados con tolerancia absoluta **1e-12** y relativa **1e-12**, para diferencias de representación numérica. La suma decimal de costes debe coincidir **exactamente**. La calidad se vuelve a sumar con aritmética decimal de precisión 50 antes de dividir por la muestra, independientemente de la suma flotante usada por el runner original.

El resultado valida estos agregados públicos, no el origen de las respuestas históricas ni que TITAN haya seleccionado óptimamente. Reproducir la selección exacta requiere la implementación y el snapshot privados fijados por hash en el protocolo. Este verificador se añadió después de obtener el resultado y no modifica el protocolo, las decisiones ni las métricas publicadas. No calcula AIQ ni nuevas configuraciones.
