Colombia · Contenido y datos
Colombia · Sala de Crisis describe qué es la suite. Esta página escribe lo que hasta ahora vivía solo en la cabeza de quien la operaba: el modelo operativo de contenido — qué archivo alimenta qué superficie, con qué ritmo se refresca cada fuente, qué dato entra después y bajo qué reglas editoriales. Las 14 rutas del mapa de módulos consumen dos carriles de datos que no se mezclan: el carril real (public/data/colombia/real/, 24 archivos citables más el termómetro de frescura) y el carril demo (public/data/colombia/fixtures/, sintético por diseño). El detalle fuente por fuente — caveats, licencias, discrepancias sin resolver — vive en public/data/colombia/real/MANIFEST.md; esta página es el mapa de operación encima de ese inventario.
Inventario: qué dato alimenta qué superficie
Carril real
| Archivo | Fuente | Superficie que lo monta | Qué aporta |
|---|---|---|---|
seismic-catalog.json | USGS FDSN | Sala de Crisis (capa sísmica) | Catálogo de réplicas M2,5+ con horas desde el evento |
shakemap-intensity.json | USGS ShakeMap | Sala de Crisis (capa sísmica) | Contornos de intensidad MMI |
shakemap-departments.json | USGS ShakeMap + DANE | Sala de Crisis (capa sísmica) | MMI máximo por cabecera departamental |
pager-estimates.json | USGS PAGER | Sala de Crisis (capa sísmica) | Distribuciones probabilísticas de fatalidades y pérdidas (modelo, no conteo) |
dyfi.json | USGS Did You Feel It | Sala de Crisis (capa sísmica) | Reportes ciudadanos y CDI máximo |
feeds.json | IFRC GO + GDACS | Briefing («Fuentes en vivo») | Feed situacional unificado, deduplicado por URL |
ifrc-appeal.json | IFRC GO | Briefing («Fuentes en vivo») | Llamamiento MDRCO036: solicitado vs. financiado (CHF) |
gdacs.json | GDACS | Briefing («Fuentes en vivo») | Alerta roja y población expuesta (modelo) |
external-trackers.json | colombiatebusca.com | Briefing («Fuentes en vivo») | Contadores del rastreador ciudadano, etiquetado «no oficial» |
pledges.json | Dossier de prensa 2026-08-13 | Fondo Milagro («Respuesta internacional») | Compromisos por donante con estatus explícito |
cat-ddo-terms.json | Dossier de prensa 2026-08-13 | Fondo Milagro («Respuesta internacional») | Términos completos de la línea CAT DDO |
trm.json | Superfinanciera (datos.gov.co) | Fondo Milagro («Respuesta internacional») | La única tasa admisible para conversiones COP→USD |
sitreps.json | IFRC GO | Fondo Milagro («Respuesta internacional») | Registros del llamamiento y reportes de situación |
services-status.json | Aerocivil + MinTIC + alocución + prensa | Servicios | Restauración por sector, cada fila con cita y as_of propios |
donation-channels.json | Prensa oficializada | Verificador de donaciones | Canales autorizados + registro negativo |
promesas-tecnologicas.json | Alocuciones y plan tecnológico | Reloj de promesas | Compromisos con reloj de 100 días, estatus como hechos |
satellite-damage.json | Copernicus EMS (EMSR916) | Reconstrucción (panel satelital) | Evidencia de daño independiente del Gobierno |
citations-real.json | — (registro) | Todas las superficies del carril real | Las 42+ citas que respaldan cada cifra mostrada |
data-health-colombia.json | — (derivado local) | Pendiente de superficie | Frescura fresh|aging|stale de cada archivo del carril |
Siete archivos más están horneados, tipados y con loader exportado (src/lib/colombia-real-data.ts) pero sin superficie dedicada todavía — son denominadores y contexto a disposición de cualquier stream:
| Archivo | Papel esperado |
|---|---|
seismic-events.json | La verdad sísmica del evento (hipocentro, magnitud mww); toda superficie que muestre profundidad debe leerlo, no la constante de fixtures |
demographics.json | Denominador por DIVIPOLA (cohorte escolar 5–16, no población total) |
health-facilities.json | Denominador para reconciliar los «179 centros de salud» (3.051 sedes IPS) |
schools.json | Denominador para las 1.819 sedes afectadas (universo con vigencia 2019) |
procurement.json | Contratación real publicada: los procesos de urgencia manifiesta a vigilar |
fiscal.json | Marco fiscal (contexto, jamás impacto) |
situation-reports.json | Destino del swap FIXTURE_TO_REAL de la fixture homónima: 1 balance oficial en vez de 3 cortes |
Carril demo
Todo lo que llega a nivel de persona u operación individual es sintético, lleva synthetic: true y monta el banner DATOS DE DEMOSTRACIÓN:
| Fixture | Superficie | Nota |
|---|---|---|
situation-reports.json | Sala de Crisis, Briefing | Trae 2 cortes reconstruido_demo que no cruzan al carril real |
affected-zones.json | Sala de Crisis (mapa) | Reparto municipal demo sobre agregados reales |
promises.json | Sala de Crisis («Lo prometido») | Los 17 compromisos del discurso |
fondo-ledger.json | Fondo Milagro | El libro mayor encadenado por hashes — el Fondo no tiene ledger público real |
reconstruction-projects.json | Reconstrucción + ficha de obra | 83 obras demo; la contratación real es procurement.json |
relief-programs.json | Alivios | Los 5 programas anunciados como reglas legibles |
households.json | Registro, Alivios | Nunca tendrá equivalente real: datos a nivel de persona, la plataforma no ingesta PII |
missing-persons.json | Buscador de personas | Igual: nunca tendrá equivalente real |
shelters.json | Red de albergues | Sin API pública conocida |
aid-shipments.json, collection-points.json | Logística | Sin API pública de la operación «Colombia Un Solo Corazón» |
citations-colombia.json | (registro fixture) | Citas del carril demo |
Cadencia de refresco
Cada fuente tiene su propio ritmo, y el ritmo está declarado — en el MANIFEST como prosa y en bake-colombia-health.ts como umbrales numéricos. Tres mecanismos:
script(API en vivo) —bun run scripts/colombia/ingest-*.tsla consulta y re-hornea; idempotente, con caché de respuestas crudas.manual reverificado— cifras transcritas de fuentes oficiales, pero el script sondea las fuentes en cada corrida (frases de carga de Aerocivil/MinTIC, cadenas del dossier enpledges, índice del Banco Mundial) y registra lo observado.manual— curado contra comunicados; se actualiza cuando la fuente publica.
| Archivo | Mecanismo | Umbral fresh / aging (días) | ¿Candidato a cron? |
|---|---|---|---|
seismic-events.json, seismic-catalog.json | script (ingest-seismic*.ts) | 2 / 7 | Sí — el candidato n.º 1 (auto-refresh de réplicas) |
shakemap-*.json, pager-estimates.json, dyfi.json | script (ingest-seismic-deep.ts) | 3 / 14 | Sí (misma corrida que las réplicas) |
feeds.json, ifrc-appeal.json, gdacs.json, sitreps.json | script (ingest-feeds.ts, ingest-sitreps.ts) | 2 / 7 | Sí, diario mientras la operación siga abierta |
trm.json | script (ingest-pledges.ts) | 1 / 4 | Sí, diario (día hábil) |
procurement.json | script (ingest-procurement.ts) | 1 / 3 | Sí — re-pull frecuente durante urgencia manifiesta (ver hoja de ruta) |
external-trackers.json | script (ingest-feeds.ts) | 1 / 3 | Sí, diario |
satellite-damage.json | script (ingest-satellite.ts) | 2 / 7 | Sí mientras haya productos pendientes de EMSR916 |
demographics.json, schools.json, fiscal.json | script | 90 / 365 | No — fuentes anuales; corrida trimestral de verificación basta |
health-facilities.json | script | 30 / 90 | No — corte periódico del registro |
services-status.json | manual reverificado (ingest-services.ts) | 2 / 7 | Parcial: el sondeo sí; la consolidación es juicio editorial |
pledges.json, cat-ddo-terms.json | manual reverificado (ingest-pledges.ts) | 3 / 14 · 7 / 30 | Parcial: la validación de cadenas sí; filas nuevas son curaduría |
situation-reports.json | manual (transcripción citada) | 2 / 7 | No — reemplazar por el boletín UNGRD es la vía, no un cron |
donation-channels.json | manual | 7 / 30 | No — cambia solo si Presidencia publica canales |
promesas-tecnologicas.json | manual | 7 / 30 | No — se actualiza por hito del reloj (próximo: día 30) |
El patrón de cron (referencia, sin adoptar todavía)
El repositorio ya tiene el mecanismo: vercel.json declara crons de Vercel (hoy uno, { "path": "/api/alerts-digest", "schedule": "0 13 * * 1" }). Ese es el patrón a seguir cuando se automatice el refresco — no se agrega ninguno en esta ola, porque las ingestas de Colombia son scripts de repositorio que escriben archivos horneados y commiteados: un cron de Vercel solo invoca una ruta serverless, así que automatizar exige primero decidir entre (a) una ruta /api/ que re-ingiere y sirve desde caché sin tocar el árbol, o (b) un job programado de CI que corre ingest-all.ts y commitea el diff (que gracias a la idempotencia solo existe cuando la fuente se movió de verdad). Esa decisión es de arquitectura, no de contenido, y queda registrada aquí como pendiente.
El termómetro: data-health-colombia.json
bun run scripts/colombia/bake-colombia-health.ts lee los 24 archivos del carril, junta la marca ingest.retrieved_at de cada uno con su cadencia declarada y hornea la clasificación fresh | aging | stale por archivo (más el rango de as_of por fila donde existe, como en services-status.json). Los umbrales son por fuente: una TRM de hace 3 días está vencida, una serie anual del Banco Mundial de hace 3 meses está fresca. El archivo declara citations: [] porque es derivado local — no hay fuente upstream que citar.
Registro pendiente en el gate. data-health-colombia.json aún no figura en los SPECS de scripts/colombia/check-real-data.ts. La razón original —que otra rama de la misma ola editaba ese archivo— quedó atrás con la integración de la ola 4; lo que queda es una decisión de diseño del gate: registrarlo obliga a abrir una exención a la regla genérica «filas ⇒ al menos una cita» para archivos derivados con citations: [], y una exención al gate se abre a propósito y con su propio PR, nunca de paso en una integración. Hasta entonces, el checker de MANIFEST no lo exige y el bake corre por fuera del prebuild.
Hoja de ruta: próximos datos
Priorizada por impacto sobre esfuerzo. «Compuerta» nombra lo que tiene que pasar fuera del repositorio para que la fila sea posible.
| # | Candidato | Qué desbloquea | Esfuerzo | Impacto | Compuerta |
|---|---|---|---|---|---|
| 1 | Boletín UNGRD / EDAN legible por máquina, cuando se publique | Reemplaza la alocución transcrita como fuente de registro del balance oficial — el reemplazo n.º 1 declarado en el MANIFEST. Con dos o más cortes, la Sala de Crisis dibuja tendencia real en vez de un punto | Bajo–medio (la forma SituationReport ya existe) | Alto | Que la UNGRD publique; hoy la cadena documental termina en el discurso |
| 2 | Re-pulls SECOP II durante urgencia manifiesta + banderas OCDS | La línea base es 2 procesos de urgencia manifiesta al 2026-08-11; el pico llegará con la contratación directa de los 12 meses del Decreto 1171. Re-pull frecuente + banderas rojas del estándar OCDS (oferente único, adjudicación ultrarrápida, concentración por contratista, precio desviado de la mediana) sobre datos reales — hoy el motor de riesgo corre sobre fixtures | Medio (ingest-procurement.ts existe; faltan cadencia y reglas) | Alto — es la superficie anticorrupción central | Ninguna: SECOP II es público |
| 3 | DANE población municipal total | Cierra la brecha n.º 1 de REAL_DATA_GAPS: denominadores reales por municipio en vez de la cohorte escolar 5–16 | Medio (descarga de hoja de cálculo, no API: parser + cita de la vigencia) | Alto | Ninguna, pero es ingesta manual versionada |
| 4 | Auto-refresh de réplicas (USGS en cron) | El catálogo deja de envejecer entre corridas manuales; la capa sísmica de la Sala se mantiene sola | Bajo (script idempotente ya existe; falta el mecanismo del patrón de cron) | Medio | Decisión de arquitectura (a)/(b) de arriba |
| 5 | Comunicados de Medicina Legal | Contadores forenses (cuerpos recibidos / identificados / entregados, com. 06: 230/205/140) como manual_cited, para que el Buscador de personas reconcilie las cuatro cifras paralelas de desaparecidos — oficial 287–496 vs. 4.211 del rastreador ciudadano | Medio (sin API; transcripción citada por comunicado) | Medio–alto | Que Medicina Legal siga publicando comunicados numerados |
| 6 | Alertas IDEAM | Capa de amenaza secundaria (lluvias/deslizamientos sobre los 5 departamentos) para Logística y Albergues — los 24+ derrumbes que aislaron el epicentro son el precedente | Medio | Medio | API/feed del IDEAM alcanzable desde el host de ingesta |
| 7 | Capas censales granulares del DANE (manzana/sección) | Planificación fina de albergues y registro: densidad y vulnerabilidad bajo cada AOI satelital | Alto (geodatos pesados, cruce espacial) | Alto a mediano plazo | Ninguna, pero exige tooling geoespacial nuevo |
| 8 | Cruce Registraduría / SISBÉN para dedup del RUD | El chokepoint señalado por la investigación: el RUD es manual, offline, sin dedup, corrido por 403 municipios, y compuerta de todo beneficio por hogar | Alto | Alto | Compuerta dura: convenio (MOU) con el Estado. No son datos públicos y la plataforma no los ingesta — esta fila existe para decir explícitamente que solo procede dentro de un piloto oficial con acceso reglado. Hasta entonces, el dedup demo del Registro sigue siendo demo |
Dos brechas conocidas siguen abiertas por fuera de esta tabla porque no dependen de nosotros: el catálogo del SGC (endpoints inalcanzables desde el host de ingesta — restauraría la sismicidad M2–M4 que USGS no ve) y el appname de ReliefWeb (trámite humano de OCHA; aprobado, la cobertura vuelve sin tocar código). Ambas están medidas con citas propias.
Principios de contenido
Estas son las reglas editoriales del carril real. Todas están impuestas por el gate (check-real-data.ts) donde una máquina puede imponerlas; donde no, están escritas aquí y en el MANIFEST.
1 · Dos carriles, cero mezcla
Real y demo viven en directorios separados con la misma envoltura de esquema. synthetic nunca se infiere; el banner de demostración lo lee de la envoltura. Un archivo del carril real con filas y sin cita registrada rompe el build. La consecuencia operativa: migrar una superficie es cambiar una ruta (FIXTURE_TO_REAL), nunca copiar filas de un carril al otro — los cortes reconstruido_demo de la fixture de balances jamás cruzan, y el checker lo verifica.
2 · sin_datos es un estado de primera clase
Un resultado vacío es un hallazgo. Chocó con 3 procesos en SECOP es el dato (el departamento del epicentro es el de menor capacidad contractual del país), no un error de consulta; 9 de los 33 activos de servicios se hornean sin cifra porque circularon en la sala de crisis sin fuente citable, y el validador rechaza una fila sin_datos que lleve cifra igual que una fila con cifra sin cita. Rellenar un hueco con un sustituto plausible destruiría lo único que la plataforma vende. Una superficie que necesita un dato que no existe muestra la brecha (REAL_DATA_GAPS).
3 · Ofertas no son recibos
Todo compromiso financiero lleva estatus explícito: ofrecido, confirmado, desembolsado, denegado. El gate rechaza cualquier fila multilateral o bilateral marcada desembolsado porque ningún desembolso al Estado consta en el registro — los USD 1.300 millones de titulares son ofertas. La disciplina se extiende a la moneda (todo monto lleva currency + unit; «mil millones» jamás se traduce «billones») y a los agregados de prensa, que viven como contexto y nunca como filas sumables. La oferta denegada (las 100 t de El Salvador) se hornea con su cita: un rechazo también es parte del balance.
4 · Procedencia de citas: el caso «cada peso»
El caso de estudio que fija la regla. El titular de Infobae del 13 de agosto — «cada peso girado quedará expuesto» — circuló como si fuera un compromiso de transparencia del Gobierno. No lo es: la frase es de Lorena Gutiérrez, decana de la Universidad de San Buenaventura, describiendo cómo funciona el artículo 215 (revisión automática de la Corte, control del Congreso, jurisdicción de los órganos de control). El Gobierno no ha hecho ningún compromiso de tablero, datos abiertos, veeduría ni auditoría para el Fondo Milagro. La cita que sí es del Presidente es anterior al sismo: el 23 de julio, sobre un traslado a la UNGRD, exigió «garantizar la trazabilidad de cada peso» (El Universal). Confundir las dos habría puesto en boca del Gobierno una promesa que no existe — y habría regalado el argumento de la plataforma, que es precisamente que esa promesa falta.
La regla que queda: toda cita textual lleva autor, cargo, fecha, medio y enlace; un titular nunca se atribuye al citado; y la paráfrasis se marca como tal. En los datos, esto es el campo de cita textual de promesas-tecnologicas.json y las citas por fila de services-status.json y pledges.json; en la prosa, es esta disciplina.
5 · Citas vivas
Una cita no es un adorno estático: lleva retrieved_at, URL y licencia, y donde la fuente es alcanzable se reverifica en cada corrida — los boletines de Aerocivil contra su frase de carga, las filas del dossier cadena por cadena, el índice de documentos del Banco Mundial en cada bake de pledges. Si el texto de un boletín cambia, la corrida lo marca en vez de sostener la transcripción en silencio. Las fuentes inalcanzables (INVIAS 403, ReliefWeb sin appname) mantienen su cita registrada precisamente para que la brecha sea medible. data-health-colombia.json es la agregación de esta disciplina: la edad de cada bake contra el ritmo de su fuente.
El plan del Día 30 — 2026-09-06
El plan tecnológico del Gobierno corre con un reloj de 100 días; el corte de los días 1–30 («Encender el motor») vence alrededor del 6 de septiembre de 2026, con cuatro entregables anunciados: el Decreto de Transparencia Digital, el piloto de blockchain en Ecopetrol, Ana IA activada y el inventario nacional de conectividad. La investigación de agosto lo llamó la señal binaria más limpia sobre si este Gobierno construye infraestructura de transparencia o la narra. Ese día la suite tiene que capturar el resultado, sea cual sea.
Qué debe capturar el reloj (/colombia/reloj)
| Paso | Detalle |
|---|---|
| 1 · Veredicto por promesa | Cada compromiso con vencimiento día 30 pasa a cumplido (con el instrumento como cita: número de decreto, evidencia del piloto, URL del inventario) o a vencido (con la búsqueda del instrumento registrada y fechada — la ausencia también se cita) |
| 2 · Sin estados intermedios sin cita | en_curso el 6 de septiembre exige evidencia publicada de avance; «se dice que avanza» no es un estado |
| 3 · Casos ya conocidos | Ana IA ya «existe» en dominio de un proveedor sin presencia gov.co ni aviso de privacidad — si eso se presenta como cumplimiento, la fila lo registra con esa nota, no con un check |
| 4 · Bake el mismo día | promesas-tecnologicas.json se actualiza y hornea el 6 de septiembre, no después; la fecha de la actualización es parte del registro |
Qué debe capturar el briefing (/colombia/briefing)
- El veredicto del día 30 como bloque principal: qué se prometió para los días 1–30, qué instrumento apareció, qué no.
- El reloj del artículo 215: si el decreto de emergencia económica se publicó (al 13 de agosto su número seguía sin publicarse), su ventana de 30 días ya venció o está por vencer — y con ella la condición previa del CAT DDO (promulgación del decreto), que toca
cat-ddo-terms.jsonypledges.json. - La tendencia de urgencia manifiesta: re-pull de SECOP II contra la línea base (2 procesos al 11 de agosto); a un mes del sismo, el conteo y su curva son el indicador anticorrupción más legible de la suite.
- Los productos satelitales de Chocó: las entregas de Quibdó e Istmina se esperaban el 14 de agosto — para el día 30, o están en
satellite-damage.jsono su ausencia es un hallazgo que el briefing dice. - El estado del reemplazo del balance: ¿ya existe boletín UNGRD legible por máquina o la fuente de registro sigue siendo un discurso de tres semanas atrás?
- La financiación del llamamiento MDRCO036 (CHF 0 financiados al corte de agosto) y la trayectoria de restauración de servicios.
- El termómetro completo: esa mañana se corre
ingest-all.ts+bake-colombia-health.ts; ningún dato del briefing del día 30 puede salir de un bakestale.
La corrida del día
bun run scripts/colombia/ingest-all.ts --refresh # todas las fuentes en vivo
# curaduría: promesas-tecnologicas.json · services-status.json · pledges.json
bun run scripts/colombia/bake-colombia-health.ts # frescura del carril
bun run scripts/colombia/check-real-data.ts # el gate, antes de publicar