ColPulse.
Datos abiertos. Contexto claro.
ColPulse · producto e ingeniería

Caso de estudio

Soy economista y construyo mis propias herramientas de datos. ColPulse es la prueba que puedes verificar: un pipeline diario que convierte datos oficiales de Colombia en un sitio donde cada cifra muestra su fuente, su fecha de corte y la huella de su archivo de origen.

  1. El problema

    Las cifras oficiales de Colombia salen de PDF, hojas XLSX, portales y APIs distintos, cada uno con su calendario, su fecha de corte y su forma de revisar datos previos. Quien necesita una lectura macro o de mercados repite ese trabajo y no siempre puede decir de dónde salió cada número.

  2. El usuario previsto

    Alguien que sigue la economía colombiana (analista, estudiante de posgrado, periodista económico) y necesita una cifra con fuente, fecha de corte y estado de calidad a la vista. Es el usuario que imagino al diseñar; no he medido usuarios reales.

  3. Mi aporte

    Es un proyecto individual. Yo formulé las preguntas, escogí las fuentes y fijé las reglas de cálculo y de publicación. El código lo escribí con asistentes de IA y lo valido con pruebas y controles automáticos.

  4. La evidencia

    1.292 pruebas automáticas (775 del sitio y 517 del laboratorio); 32 indicadores activos y monitoreados (el registro maestro tiene 41 activos; 9 aún no están en el alcance monitoreado) de 4 entidades (Banco de la República, DANE, FRED, Superfinanciera); el flujo daily.yml corre cada día a las 11:30 UTC (06:30 en Bogotá) y publica el sitio. Cada archivo publicado tiene su SHA-256 en package_manifest.json. Las fuentes candidatas tienen decisión escrita (1 para activar, 2 aplazadas, 4 por evaluar; config/source_candidates_v2.csv).

  5. La limitación principal

    Una sola persona, sin usuarios externos medidos ni revisión independiente. 'Validado' aquí significa verificado por mis pruebas y controles, no auditado por terceros; y ColPulse no sustituye a las entidades que publican los datos.

Código: colombia-strategy-monitor (repositorio privado; pide acceso por LinkedIn)

Qué hice yo y qué no

Reparto del trabajo entre mi criterio, los asistentes de IA y la verificación automática
Parte del trabajoQuiénCómo se hizo y cómo se comprueba
Preguntas de investigaciónYoDefiní las 9 preguntas de la sección Análisis (dólar, inflación, tasa, empleo, recesión, COLCAP, transmisión, traspaso a precios y crédito; src/content/analysis_data.py) y el caso de política monetaria.
Selección de fuentesYoRegla: fuente primaria antes que conveniencia (docs/COLPULSE_MASTER_PLAN.md). Cada fuente candidata queda con una decisión escrita en config/source_candidates_v2.csv y el catálogo activo en config/indicators_master.csv.
Decisiones de cálculoYoFórmulas, agregaciones y umbrales de frescura: docs/ECONOMIC_TRANSFORMS.md y la página de metodología. El IPC anual, por ejemplo, se deriva del índice oficial de DANE y se rotula [derivado].
ImplementaciónCompartida con asistentes de IALa mayor parte del código la escribieron asistentes de IA de programación a partir de mis especificaciones y revisiones. La portada se diseñó con una herramienta de IA y se integró con un traspaso escrito (docs/claude_frontend_integration.md).
ValidaciónYo, apoyado en pruebas automáticas1.292 pruebas en CI; resultados calculados a mano (tests/test_derivations.py, tests/test_dane_ipc.py); SHA-256 del archivo descargado y de cada archivo publicado; compuerta editorial (docs/EDITORIAL_QA.md); validador del frontend (scripts/validate_claude_frontend.py).
MantenimientoYo, con automatizaciónLa actualización diaria es automática (daily.yml). Si una fuente falla, el indicador se marca en Estado; las correcciones las decido y las registro yo (docs/CORRECTIONS.md, visible en Metodología).

El papel de los asistentes de IA

Delegué
Escribir y reescribir código (conectores, páginas, pruebas) a partir de especificaciones y criterios míos, y proponer estructuras de página y de datos.
Reviso
Qué se mide y con qué fórmula, qué fuente es admisible, qué se publica y con qué lenguaje. Un cambio no entra si no pasa las pruebas, la compuerta editorial y los contratos de datos.
Se comprueba con
Pruebas en CI en cada push (ci.yml), pruebas con resultados calculados a mano, huellas SHA-256 del archivo descargado y de cada archivo publicado (package_manifest.json), y, en el caso de política monetaria, un script independiente que recalcula la tabla desde los datos públicos.
Lo que no puedo afirmar
Que cada línea sea mía ni que alguien distinto de mí haya auditado el código. Sí puedes comprobar qué hace con las pruebas y los hashes.

Un error real y cómo se corrigió

  • Corte fijo en la portada. El prototipo de la portada traía textos escritos a mano como «corte 2026-07-09» y «16/16 indicadores OK», más series de precios simuladas. Un dato así parece cierto y no lo es. Corrección: la portada muestra solo lo que lee de data/*.json (la fecha de publicación sale de data/manifest.json) y la prueba test_template_has_no_hardcoded_fallback_figures en tests/test_home_assets.py hace fallar el build si reaparece cualquiera de esos valores.
  • Tipografía que nunca cargaba. El CSS de las páginas estáticas pedía IBM Plex y Fraunces, pero el site.css publicado no declaraba ninguna regla font-face (verificado en colpulse.online/site.css el 2026-10-08): el navegador usaba Arial y Georgia. Corrección en esta revisión: src/content/chrome.py declara las 11 fuentes autoalojadas y tests/test_chrome.py comprueba que cada url() apunta a un archivo de la lista cerrada del paquete.

El registro público de correcciones está en Metodología.

Inventario de módulos

Cada módulo del sitio y de research/ con su estado, la evidencia que lo respalda (calculada de este repositorio en cada publicación) y su limitación principal. Ningún módulo queda sin etiqueta.

  • validado pruebas automáticas que pasan en CI y controles de calidad en cada corrida. No significa auditado por terceros.
  • experimental funciona y tiene pruebas, pero sus resultados no se han evaluado fuera de muestra, no se publican como cifras o dependen de supuestos sin contrastar.
  • demostración muestra una capacidad con datos de ejemplo o sin contenido real; no es un producto en uso.
Sitio público y pipeline: 19 módulos (12 validado · 4 experimental · 3 demostración)
Módulo o secciónEstadoEvidenciaLimitación principal
Conectores oficiales (Banco de la República, DANE, Superfinanciera) y contrato de observacionesvalidado33 pruebas (parsers con archivos de ejemplo y contrato con fuente, hash y fecha de descarga)Dependen del formato que publica cada entidad. Si cambia, el indicador se marca fallido en Estado; no se rellena.
Derivaciones documentadas (IPC anual y mensual desde el índice DANE, TRM promedio y cierre mensual, ICV)validado9 pruebas (resultados calculados a mano para entradas pequeñas)Son cálculos propios sobre datos oficiales: se rotulan [derivado] y no se presentan como cifra de la entidad.
Validación, salud y frescura por indicadorvalidado20 pruebas (reglas de calidad, umbrales de frescura y registro de indicadores)El umbral de frescura es una regla propia por frecuencia; 'al día' no equivale a una auditoría independiente de la fuente.
Series globales de FRED (Global Pulse)validado12 pruebas (conector y panel global)Requiere una clave de FRED en el servidor de CI. Son series de EE. UU. y del mundo, no de Colombia.
Escenarios globales condicionalesexperimental2 pruebas (regresión OLS con errores HAC y compuerta p ≤ 0,10)Impactos condicionales de un mes con los demás factores constantes; no son pronósticos ni evidencia causal.
Compuerta editorial y registro de afirmacionesvalidado11 pruebas (términos restringidos y etiquetas obligatorias)Es una lista corta de términos: bloquea lenguaje desproporcionado, no verifica hechos.
Paquete público cerrado, manifiesto y huellas SHA-256validado13 pruebas (lista cerrada de archivos y verificación del paquete)El hash identifica el archivo publicado; no certifica la metodología de la fuente.
Portada (Inicio, Mapa, Bolsa, Radar, Análisis, Indicadores, Metodología, Estado)validado46 pruebas (contratos de datos, recursos autoalojados y ausencia de cifras fijas)Las pruebas revisan contratos y archivos, no la experiencia de uso; no hay pruebas con usuarios.
Páginas por indicador, Auditoría y Estadovalidado14 pruebas (páginas generadas desde el reporte de salud)Muestran el estado de cada serie en el momento de la corrida; no guardan historia de estados.
Linaje: Rastrea una cifravalidado7 pruebas (cadena de custodia leída de artefactos del pipeline)Muestra la cadena de las cifras titulares; lo que no está en los artefactos se rotula 'No disponible'.
Atlas territorial: perfiles departamentalesvalidado7 pruebas (parser DANE y páginas); 33 territorios publicadosSolo PIB departamental corriente anual y derivados; otras dimensiones aún no están y la ausencia nunca se rellena.
Caso: política monetaria (tasa real ex post)validado11 pruebas (fórmula con respuesta conocida, huella de la tabla y script autónomo)Es ex post y sin tasa neutral estimada: describe la historia, no establece qué fue adecuado.
Modelos econométricos (Análisis): OLS, SARIMAX y bases de comparaciónexperimental52 pruebas (modelos, backtests y compuerta de disponibilidad); 8 de 9 preguntas con resultado estimado en la última corridaUn resultado se publica solo si supera el backtest fuera de muestra contra una base simple; varias preguntas siguen pendientes.
Radar de noticias: historias por grupo dueño, noticias locales y fichas de mediosexperimental96 pruebas (conector de feeds con red simulada, agrupación, etiquetado de departamentos, compuerta de verificación y página); 38 feeds verificados de 48 en la lista; 70 filas de propiedad y calificación verificadas y 12 pendientes de verificar (no se publican); 6 titulares curados a manoLa agrupación compara palabras, no significados, y se equivoca a veces. Solo se leen medios con feed RSS público; faltan medios y departamentos. La propiedad y la calificación solo se muestran cuando están verificadas con fuente y año; hoy casi todo está pendiente, así que los medios salen como «Propiedad sin documentar». Cobertura no implica veracidad ni intención.
Novedades legislativasdemostración26 pruebas (cargador estricto, compuerta de lectura y página); módulo nuevo; 0 novedades en el catálogo curado a manoSin novedades cargadas no hay nada que evaluar: la página lo dice. No es asesoría jurídica; la lectura se oculta mientras su revisión jurídica esté pendiente.
Visor de Colombia (prototipo, fuera del menú)demostración13 pruebas (datos de las capas, regla de 'lo que más se movió' y archivos del mapa)Prototipo en pruebas: una sola fuente por departamento (PIB), mapa base de un tercero que puede fallar y sin agenda porque no hay calendario de publicaciones.
Renta fija (TES): página y compuerta del paquete selladoexperimental47 pruebas (verificación de hashes y esquemas, estados y página); estado del paquete hoy: paquete verificado y revisadoLa página no muestra cifras hasta que el paquete esté verificado y revisado; ColPulse no recalcula nada de este bloque.
Páginas de documentación: Caso de estudio, Laboratorio, Metodología y Resumenvalidado44 pruebas (cifras calculadas del repositorio y registro en el paquete)El texto es mío y no ha sido revisado por terceros; cada afirmación remite a un archivo o a una cifra calculada.
ArtículosdemostraciónEstructura de fichas lista; 0 artículos publicadosSin artículos reales no hay nada que evaluar: la página lo dice y no muestra tarjetas de relleno.
ColPulse Research (carpeta research/): 11 módulos (2 validado · 7 experimental · 2 demostración)
Módulo o secciónEstadoEvidenciaLimitación principal
Renta fija: matemática de bonos (research/**/fixed_income/analytics)validado204 pruebas (archivos de prueba de renta fija); con pruebas de respuesta conocidaCalcula bajo convenciones declaradas; si una convención no está verificada, el paquete lo marca y la página lo muestra.
Renta fija: catálogo sellado con hashesvalidadoArchivos de catálogo detectados en research/**/fixed_incomeEl sello prueba integridad del archivo, no la exactitud de su contenido.
Renta fija: libro de pronósticos puntuado con BrierexperimentalCódigo de puntuación Brier detectado en research/**/fixed_incomeUna puntuación Brier solo informa con muchos pronósticos resueltos; no se publica como evidencia de habilidad.
Renta fija: monitor semanalexperimentalCódigo de monitor detectado en research/**/fixed_incomeResume cambios de la semana; es descriptivo y no emite recomendaciones.
Conectores de datos abiertos (Banco Mundial, UN Comtrade, GDELT, Wikidata)experimental6 pruebas (parsers con respuestas de ejemplo)Se ejecutan en local y no alimentan el sitio público.
Grafo temporal mundial, exposición y agentes de investigaciónexperimental19 pruebas (grafo, propagación de exposición y agentes)La presión de exposición es diagnóstica, no una probabilidad; sin evaluación fuera de muestra.
Datos empresariales SEC/EDGAR y valoración (renta variable, congelado)experimental41 pruebas (parser XBRL, estados financieros normalizados y valoración)Congelado: heredado del enfoque de acciones, sin mantenimiento activo.
Quant Lab (walk-forward, torneo de estrategias, capacidad, validación prospectiva; congelado)experimental52 pruebas (validación retrospectiva y libro prospectivo)Congelado. Son diagnósticos retrospectivos; no seleccionan ganadores ni sugieren operaciones.
Conectores de precios de mercado (Tiingo, Alpha Vantage; congelado)demostración38 pruebas (contratos con respuestas de ejemplo)Requieren la clave personal de cada usuario y sus datos no se publican; sin datos reales en el sitio.
IA supervisada: cola de trabajo y borradores con citas (Ollama local)experimental35 pruebas (propuesta, citas, relevancia y revisión humana)El modelo solo propone; una persona revisa. No hay evaluación de la calidad de los borradores.
API local de solo lectura y terminal Reactdemostración20 pruebas (contrato de la API)Corre solo en la máquina local; no está desplegada ni la usa nadie más.

En números

Calculados del propio repositorio en cada publicación [derivado]. Un guion indica que el dato no se pudo calcular.

  • 1.292Pruebas automatizadaspytest en CI · sitio + laboratorio
  • 32Indicadores activosmonitoreados en el alcance v1; registro maestro: 41
  • 4Fuentes oficialesBanco de la República, DANE, FRED, Superfinanciera
  • 14Conectoresun adaptador por fuente
  • 208Módulos Pythonsitio + ColPulse Research
  • 28Decisiones (ADR)arquitectura documentada
  • 6Workflows de CIGitHub Actions

Fuente: conteo del propio repositorio en esta publicación [derivado]

Arquitectura de punta a punta

  1. Fuentes oficialesDANE · Banco de la República · Superfinanciera · FRED
  2. Conectoresun adaptador por fuente; descarga, hash y parseo
  3. Validación y contratoesquema canónico de observaciones y banderas de calidad
  4. Salud y frescuraestado por indicador con umbral propio
  5. QA editorialtérminos restringidos bloquean la publicación
  6. Paquete público cerradolista explícita, manifiesto y SHA-256 por archivo
  7. Sitio estáticocolpulse.online, publicado cada día

Decisiones de ingeniería

Sitio estático en vez de servidor

El sitio completo se genera en CI y se sirve como archivos.

Se gana: cero servidores que mantener, costo casi nulo y cada versión es inspeccionable.

Se cede: no hay consultas a la medida en tiempo real; todo se precalcula en cada build.

Paquete sellado con lista cerrada y SHA-256

Solo los archivos de una lista explícita llegan al sitio; el manifiesto registra tamaño y SHA-256 de cada uno y la verificación rechaza archivos inesperados.

Se gana: datos crudos, intermedios y registros internos no pueden filtrarse por accidente.

Se cede: cada página nueva exige registrarla a propósito; es fricción deliberada.

Degradación honesta en vez de fallar

Si un conector falla, el error queda como estado del indicador y el resto del sitio se publica; un paquete externo inválido produce una sección vacía con un mensaje claro.

Se gana: una fuente caída no apaga el producto completo.

Se cede: el sitio puede salir con huecos; por eso la salud de cada serie es pública.

Sin datos inventados

Si un número no se puede calcular o verificar, se muestra un guion. Los paquetes de ejemplo de las pruebas van rotulados [PRUEBA].

Se gana: cada cifra visible tiene una fuente rastreable.

Se cede: a veces la página se ve incompleta; se prefiere eso a rellenar.

Humano en el circuito para la IA

En ColPulse Research la IA local solo propone tareas y borradores con citas; una persona revisa fuentes, relevancia y hechos antes de que algo avance.

Se gana: ningún sistema automático aprueba su propio trabajo.

Se cede: velocidad; la revisión humana es el cuello de botella a propósito.

Licencias respetadas

Los precios de mercado usan la clave personal de cada usuario y se quedan en el entorno local; la renta fija solo se publica si el paquete declara revisión de condiciones de uso.

Se gana: el sitio público no redistribuye datos que no puede redistribuir.

Se cede: parte del análisis vive solo en el laboratorio local.

Qué aprendí y qué sigue

Aprendizajes

  • La parte difícil no es graficar: es acordar qué significa cada fecha de corte y cada revisión.
  • Una lista cerrada de lo que se publica es más segura que una lista de lo que se excluye.
  • Las pruebas automatizadas funcionan como especificación ejecutable entre las dos partes del proyecto.
  • Un dato de ejemplo escrito a mano llega a producción si nada lo impide; hace falta una prueba que lo prohíba.

Qué sigue

  • Mantener el bloque de renta fija (curva TES): paquete sellado, revisión de condiciones de uso y contrato con pruebas; su estado actual está en el inventario.
  • Ampliar cobertura de fuentes oficiales manteniendo el mismo contrato de observaciones.
  • Conseguir revisión externa: hoy ninguna parte del proyecto ha sido auditada por terceros.

Contrato del bloque de renta fija: docs/FIXED_INCOME_BLOCK.md

In English

Felipe Cuello Castro: an economic and markets analyst who builds his own data tools. ColPulse is a daily pipeline that turns scattered Colombian official statistics (PDFs, spreadsheets, APIs with different cut-off dates) into a verifiable public website. Every value follows a canonical observation contract with source URL, file hash and quality flag; each indicator carries its own freshness status; an editorial gate blocks overstated claims; and only an allowlisted, SHA-256-sealed package is published every day.

It is a one-person project built with AI coding assistants: I set the questions, the sources and the calculation rules; automated tests, hashes and a stand-alone script check the results. No part of it has been audited by third parties. Every module is labelled validated, experimental or demonstration above. Figures on this page are computed from the repository at build time. See the end-to-end case (in Spanish).