El 10 de agosto de 2026 tembló en el Chocó: magnitud 7,4, 108 km de profundidad, epicentro a dos kilómetros de San José del Palmar. El USGS le declaró alerta PAGER roja.
Lo que yo quería saber esa mañana cabía en una pregunta corta. A qué municipio llega la ayuda primero.
No lo encontré en ningún mapa. Y el dato estaba: la población está contada, los hospitales y las escuelas están georreferenciados, las vías, mapeadas, y el USGS publica en horas un modelo de cuánto sacudió el suelo en cada punto. Cada pieza por su lado, y ninguna tabla que las juntara por municipio.
Este post va en dos mitades: primero el problema, que es de quien reparte la respuesta; después la máquina, por dentro. El código está en el repositorio.
El epicentro no te dice dónde ayudar
A los sismos les ponemos el nombre de su epicentro. A este lo llamé el del Chocó durante semanas.
Cuando crucé el mapa de sacudida con la población, el municipio con más habitantes en la banda más fuerte era Santiago de Cali: 772.110 personas expuestas. Quibdó salía de séptimo.
Ranking municipal del informe del Chocó: Santiago de Cali encabeza con 772.000 personas expuestas en MMI≥7; Quibdó es el séptimo
Ahí está el problema entero, en una tabla. Un epicentro es un punto; la sacudida es un campo que se reparte según la profundidad, la geología y la distancia. Y la población se reparte por su cuenta.
El mismo sismo con la capa de población: los hexágonos poblados se apilan en el eje Pereira-Armenia-Cali y el Chocó del epicentro queda casi vacío
Magnitud e intensidad no son lo mismo, y confundirlas es el peor error de lectura que este sistema puede provocar. La magnitud es un número único para el temblor entero; la intensidad es un mapa y mide la sacudida en un sitio. Cuando lees MMI≥7, ahí dice intensidad 7 o más.
Cuánta población quedó sacudida llega pronto: PAGER, del USGS, lo estima para el país entero. Lo que tardaba días era el dónde, por municipio y con cuántas sedes de salud, escuelas y vías adentro. Sin municipio no hay a quién llamar ni cómo repartir tres brigadas entre veinte. El punto rojo caía en San José del Palmar; la tabla, además, señalaba a Cali con 772.110 personas.
El informe que yo quería ver esa mañana
Lo que el sistema calculó para ese sismo, en la banda MMI≥7 y con ShakeMap v9: 3.069.002 personas expuestas, de ellas 373.245 de 65 años o más; 519.018 edificaciones; 971 sedes de salud; 1.068 sedes educativas; y 15.749 km de vía, 1.897 en red primaria y secundaria. En MMI≥6, 6,8 millones de personas. La sacudida no alcanzó la banda MMI≥8.
Y antes de que alguien las cite: este reporte es una reconstrucción retrospectiva, y el panel lo rotula así. Lo calculé semanas después, así que queda fuera de las latencias que vienen.
Recorrido por el visor, sin audio.
Cada cifra viaja con tres datos pegados: el número, la versión de ShakeMap que la produjo y la palabra expuesta. El USGS revisa sus ShakeMaps, y el del Chocó ya va por la v10: al reprocesarlo, la población en MMI≥7 bajó de 3,1 a 2,4 millones. El sistema recalcula solo y lo anota. Sin su versión, una cifra no se puede reproducir.
Dos relojes, y uno me deja mal
Las latencias están en una página de estado que cualquiera abre.
Mido dos relojes. El primero arranca cuando mi vigía detecta el evento en el catálogo: es el tramo que yo controlo, y mi objetivo son 60 minutos. Va en 68,9 de mediana. Me paso por nueve, y no tengo excusa.
El segundo arranca cuando la tierra se mueve, y marca 92,1. En medio está el trabajo sismológico que tiene que existir antes de que yo cruce nada: localizar el epicentro y modelar la sacudida. Lo produce el USGS, gratis, y tarda lo que tarda. Si los sumara en una sola cifra, no se vería cuál de los dos tramos es el mío.
Los dos relojes en una línea de tiempo: 68,9 minutos de mediana desde que el vigía detecta el evento, 92,1 desde que tiembla
Durante meses creí que lo difícil era calcular rápido. El cómputo tarda segundos; lo que se comía el presupuesto era enterarse. Entre el 25 y el 30 de agosto, con el cron de GitHub Actions como único disparador y 23 ejecuciones del vigía, la detección sola daba una mediana de 157 minutos y un peor caso de 12,8 horas. Desde el 31 la dispara un aviso externo cada cinco minutos, y el intervalo medido entre revisiones está en 5,0 minutos.
Un aviso: esas cifras salen de dos eventos en vivo y se mueven con cada uno nuevo.
Seis pipelines y ningún servidor
Hasta aquí el problema. Ahora la máquina, que casi nadie enseña.
La cadena de pipelines con la tabla de exposición en el centro: P0 la construye, P1 vigila el catálogo de USGS, P2 cruza la intensidad contra ella y P3 emite el informe
Son seis pipelines de Python 3.12, unas 12.500 líneas, todos por el mismo CLI y sin credenciales.
P0 arma la tabla de exposición de un país, y es la mitad del trabajo del proyecto. Cada fila es un hexágono H3 de resolución 8, unos 0,74 km² de media sobre LATAM; las columnas, cuántas personas viven ahí y de qué edad, cuántas edificaciones hay, cuántos kilómetros de vía, si cae dentro un puesto de salud o un colegio, y qué cubre el suelo. Salen de GHS-POP, WorldPop, Overture, HOT y ESA WorldCover. Van diecinueve países y 649,8 millones de personas; Colombia aporta 559.103 hexágonos, 52.620.466 habitantes y 1.122 municipios, con un desvío del −0,72 % frente al DANE. Se rehace cada trimestre, o en tu máquina con make country ISO=COL.
P1 es el vigía: revisa el catálogo de USGS, se queda con los eventos de magnitud 5,5 o más en América Latina y no despacha dos veces el mismo. P2 convierte los contornos de intensidad en hexágonos, los une contra la tabla del país y muestrea deslizamiento y licuefacción de Ground Failure. P3 emite el paquete publicable: report.json, markdown, mapas, CSV por municipio y texto para redes. P5 hace lo mismo con los focos de calor de NASA FIRMS, cada seis horas; es hermano de P2 y solo cambia de dónde sale la geometría. P4, la brigada de daño por edificación con IA, es fase 2 y no existe.
Debajo no hay servidor propio, ni base de datos, ni llaves de API: la condición era que una comunidad lo mantuviera sin presupuesto y que cualquiera lo reprodujera entero. Catorce workflows de GitHub Actions son la infraestructura, el estado vive en git con events/ de base de datos, la tabla va en Releases porque pesa demasiado, y un runner gratuito lee GeoParquet con DuckDB y publica en GitHub Pages sobre MapLibre. El vigía es el reloj de todos: corre seguido y despierta a los demás por edad, en vez de confiar en que GitHub honre siete crons.
Tenerla hecha de antemano convierte semanas en segundos, y elegir sus fuentes pide criterio: ya escribí sobre cómo evaluar una capa antes de cruzarla.
Las puertas que un informe tiene que pasar
Las puertas que atraviesa un informe antes de publicarse, del contrato en JSON Schema al dibujo del mapa
Nada de esto sirve si publica una cifra mala: la mitad interesante del repositorio son las comprobaciones. Los contratos van en JSON Schema, incluidas las dos respuestas de USGS que el sistema consume, y las pruebas golden corren contra productos congelados: un cambio de metodología que no se declare rompe la prueba. Una comprobación nocturna contrasta las fuentes vivas contra su contrato: así me entero de que un tercero cambió el formato antes que un sismo. Y Playwright abre el visor en un Chromium de verdad: un mapa que no pinta no lo caza una prueba unitaria.
Dos guardias más, mis favoritas. validate_layer_coverage detiene el build si una capa requerida suma cero en todo el país: una capa que informa cero donde no midió no sale. Y otra falla si una función pública se queda sin quien la llame, porque el fallo que más se me ha repetido aquí es ese: una pieza probada que nadie llamaba.
Encima van ruff y mypy en estricto. Hoy son 2.472 pruebas sin red y 157 que abren el visor; las corrí el 16 de septiembre y están en verde.
Veinte rechazos seguidos y un titular de cero personas
El primer evento en vivo llegó el 2 de septiembre de 2026: magnitud 5,6, a 71 km al oeste de Puerto Madero, México. No salió como debía. El vigía lo detectó y lo despachó en minutos, y el cálculo lo rechazó veinte veces seguidas: trataba como un error que la intensidad no alcanzara ni un hexágono, y esa vez se había quedado mar adentro.
El segundo hallazgo salió de correr el catálogo histórico entero. De los 27 informes publicados, 17 no alcanzan MMI≥7 sobre población y 9 tampoco llegan a MMI≥6: son los profundos y los de mar adentro, que por aquí son la mitad. Tehuantepec 2017, magnitud 8,2 y 98 fallecidos, es uno; su máximo sobre población mexicana se queda en MMI 6,5.
Los 27 informes por la banda que alcanzaron sobre población: 10 en MMI≥7, 8 en MMI≥6 y 9 en ninguna
Hasta que los corrí, mi producto daba por supuesto que MMI≥7 era la banda, y en esos casos publicaba un titular de cero personas y los municipios en orden alfabético. Ninguna prueba sintética me habría enseñado eso.
Y un tercero, por si alguien cree que estos fallos avisan. Un informe publicado decía 1.397 km de vía cuando eran 8.503: seis veces corto. Nadie lo habría notado, porque 1.397 km es creíble para una zona de intensidad.
Lo que CENTINELA no es
Exposición no es daño. El sistema cuenta quién y qué estaba dentro de la zona sacudida; si una edificación se rompió, esto no lo sabe. Tampoco es alerta temprana: el informe sale después del temblor y no le recomienda a nadie evacuar. No estima víctimas, no dictamina habitabilidad y no reemplaza al Servicio Geológico Colombiano ni a las unidades de gestión del riesgo.
Capacidad regional hay. El SGC publica sus propios mapas de intensidad instrumental de forma automática, el IGAC voló ortofoto sobre el Chocó, el hub LAC de HOT se activó con OSM Colombia y GEM SARA se construyó con expertos de toda la región. Kontur Population y Disaster Ninja ya publican exposición sobre hexágonos.
Lo que añado es la pieza del medio: el corte por municipio que se puede sumar, el equipamiento que PAGER no cuenta y el cruce con deslizamiento y licuefacción. El código va bajo Apache-2.0 y las diecinueve tablas bajo ODbL, porque llevan edificaciones y vías de Overture.
El detalle está en la ficha del proyecto. Falta lo más importante, y no depende de mí: que alguien que reparte brigadas lo use y me diga qué le sobra.
Aquella mañana de agosto cada pieza ya existía por su lado. Hoy el vigía las junta en 68,9 minutos de mediana desde que detecta el evento.
Si mañana tiembla cerca de ti y esa tabla te llega mientras vas camino a la primera reunión, ¿qué decides distinto?
