Cada tarjeta, cada gráfico y cada vídeo del laboratorio sale de una orden de terminal. Nadie los edita a mano. Esto es cómo está montado.
El laboratorio no tiene interfaz: tiene herramientas de terminal, cada una con ayuda en todos los niveles (--help). Eso permite repetir cualquier pieza, escribir una jornada entera como una secuencia de órdenes y revisar qué cambió.
| Herramienta | Para qué sirve | Ejemplo |
|---|---|---|
| postgame.sh | Generar a mano cualquier tarjeta o gráfico (carta de jugador, rueda de percentiles, mapa de tiro, comparativas…), buscar identificadores reales por nombre y ver lo ya generado | postgame.sh find "leveque" · postgame.sh generate wheel <jugador> <competición> |
| postgame.sh video | Vídeos verticales de 1080×1920: quinteto ideal, marcadores, un partido en 21 segundos, mapa de tiro, duelo entre jugadores, resumen de jornada | postgame.sh video mejor 2 |
| export_snapshots | Calcular y escribir los ficheros que lee la web: jornadas, perfiles, evolución, quintetos, partidos, tiros, asistencias, similitud y familias | export_snapshots jornada 2 · export_snapshots similares todas |
| sync-data.sh | Copiar lo exportado a la web, regenerar el índice de temporadas y las cifras de la página de método | sync-data.sh |
El cálculo de minutos derivados «reanuda donde lo dejó» y guarda cada 20 partidos: se puede cortar y relanzar.
El vídeo de un partido y la página del partido en la web leen los mismos datos exportados: cuentan exactamente lo mismo, porque no hay dos cálculos.
Nadie teclea números: se busca «leveque» y se obtiene el identificador real.
Las tarjetas y gráficos se dibujan con Matplotlib y Pillow. El estilo neobrutalista (bordes gruesos, sombras sólidas desplazadas, colores planos y saturados) no es una plantilla: es un conjunto de funciones y constantes que todas las piezas reutilizan.
Hubo dos (uno oscuro con neones). Se eliminó: mantener dos significaba que cada cambio se hacía dos veces y uno siempre se quedaba atrás.
Una tabla de colores por club (no por identificador, porque el identificador de equipo cambia cada temporada). Para cada color se calcula el color de texto legible por contraste.
En la rueda de percentiles, una cifra donde más de la mitad de la liga está a cero (los tapones: el 84 % de las actuaciones no tiene ninguno) lleva un asterisco: un P95 con 0,7 por partido es verdad aritmética y mentira narrativa.
No números sueltos: todas las tarjetas hermanas comparten rejilla.
Cada vídeo es una secuencia de escenas, y una escena es solo un par: una duración y una función que sabe dibujarse sobre un lienzo en cualquier instante t. El motor las recorre fotograma a fotograma con Pillow, las entrega a imageio, que codifica el MP4 de 1080×1920 (9:16, el formato de los vídeos cortos verticales), y FFmpeg mezcla después la música si la hay, con un fundido final, sin recodificar la imagen.
Un vídeo no calcula nada propio: lee los ficheros exportados.
La rotación de una carta, el brillo y el cambio de tamaño se calculan por fotograma con precisión de píxel, y hubo que eliminar saltos de tamaño, un cruce de fundidos que bajaba la opacidad a mitad y bordes que aparecían de golpe.
Cortes y barridos entre escenas, y puntos de progreso que cuentan una pieza por punto.
De una pista, analizando su pulso con NumPy. Y todo funciona igualmente sin música.
Un partido tiene cientos de eventos y una persona cuenta tres cosas de él. La capa de datos detecta candidatos con reglas explícitas, no a ojo:
Racha de puntos consecutivos de un equipo sin respuesta del rival, calculada sobre los aciertos ordenados cronológicamente. Para que merezca su propio mensaje se exigen 6 puntos o más: un 2-0 no sostiene una frase.
El pipeline marca como clutch los momentos con diferencia de 5 puntos o menos en los últimos 2 minutos del 4.º cuarto o la prórroga, y la capa de datos cruza esa ventana con los eventos reales para saber qué pasó (quién anotó, quién robó). Hacen falta 2 jugadas concretas: una aislada no basta.
El mejor jugador de una jornada se decide con un desempate explícito y único para toda la web: valoración, y a igualdad +/-, victoria del equipo, menos minutos y, en último lugar, identificador.
Los hilos de análisis (de un partido, de una jornada, comparativas) los redacta como borrador un modelo de lenguaje que trabaja como asistente. El diseño parte de una idea: no confiar en que el modelo se porte bien, sino hacer imposible que se porte mal.
Dos servidores de herramientas (63 en total) que consultan los datos reales de Silver: ficha de partido, acta, clasificación, rachas, comparativas. Para escribir una cifra, el modelo tiene que haberla pedido a una herramienta.
No tiene ninguna herramienta de publicar: la puerta de aprobación humana es una ausencia, no una norma. La publicación real ni siquiera está implementada.
Antes de aceptar un borrador, un validador comprueba que cada cifra de dos o más dígitos aparece en lo que devolvieron las herramientas (reconstruyendo porcentajes de tiro a partir de aciertos e intentos, para no dar falsos positivos).
Instrucciones por tipo de hilo (post-partido, comparativas, recapitulación, cierre de jornada) fijan tono y reglas, como «nunca inventes un dato».
Hubo antes dos rutas (un modelo en local y otro en la nube) con registros de herramientas paralelos. Se retiraron: cada cambio había que aplicarlo dos veces y una de las copias siempre se quedaba atrás. Hoy el motor es la herramienta de terminal de Gemini (Antigravity), contra los dos servidores de herramientas.
La web no consulta nada: lee ficheros. Las herramientas escriben JSON estático, sync-data los copia al proyecto web y regenera el índice de temporadas y las cifras de la página de método. Se prueba, se construye, se audita y se sube con un commit; la plataforma despliega sola, y después se comprueba que producción sirve exactamente lo esperado (páginas, datos y redirecciones).
Es una arquitectura de solo lectura: sin base de datos, sin servidor propio que mantener, rápida y barata. Hay una excepción honesta: las miniaturas para compartir en redes se generan con una función de la plataforma.
Las pruebas automáticas corren contra datos reales, sin simular la lógica de negocio: más de 550 entre los dos repositorios, más las de la lógica de la web. Cada error de los de estos artículos tiene su prueba de regresión con el caso que lo provocó.
← Los datos: de la FEB a Delta Lake