Appearance
El pipeline de datos
Futuros no consulta APIs en vivo cuando alguien abre una página. Todo el corpus se ingiere, se hornea y se congela como JSON estático antes del despliegue; la SPA solo lee archivos. Eso hace la plataforma rápida, cacheable, offline-capaz — y, sobre todo, auditable: cada cifra que ves fue verificada en tiempo de build contra su registro de fuente. Este pipeline sirve directamente al Pilar 1 — Fideicomiso de Datos: un corpus con procedencia y licencia limpia es el único activo que un modelo regional no puede copiar.
FUENTES EXTERNAS REGISTRO INGESTA (aislada por fallo)
WHO · UNESCO · IMF ┌──────────────────┐ ┌───────────────────────────────┐
OWID · UN SDG · NSO ──▶│ SourceRecord │────▶│ 1 multisource → parameter-cache│
Climate Watch · V-Dem │ + AdapterEngine │ │ 2 documents → documents/news │
UCDP · GDACS · … │ (sonda-probada) │ │ 3 signals → señales citadas│
└────────┬─────────┘ └──────────────┬────────────────┘
│ compuerta de licencia │ refresh-meta.json
│ (redistribute:false + ▼
│ motor no-provider = error) BAKE (~50 scripts)
▼ scores · markets · pulse
error de COMPILACIÓN ontology · convergence · …
│
▼
7 COMPUERTAS DE PROCEDENCIA ◀────────── public/data/** (JSON estático)
(prebuild; fallan el build) │
▼
SPA (solo lee archivos)El registro de fuentes
Cada fuente externa es un SourceRecord declarado en scripts/sources/registry/. Define de dónde sale el dato y bajo qué reglas puede publicarse:
AdapterEngine— el tipo de conector:series,bulk,sdmx,ckan,ocds,event,entity,microdata,providerometa. Cada API externa tiene un solo adaptador enadapters.ts(WHO GHO, UNESCO UIS, OpenAlex, Climate Watch, UN SDG, UNHCR, OWID, IMF DataMapper, SDMX/DBnomics genérico…).LicensePosture—kind/redistribute/aggregates_only: qué se puede republicar y qué solo se puede citar.- Verificación por sonda —
sources.tsesSOURCE_REGISTRY_V2, con endpoints probados;regulation-sources.tses el registro hermano para el rastreo de leyes de IA. Losnso/*.jsonson 27 listas de fuentes por oficina nacional de estadística.
Los adaptadores están aislados por fallo: un endpoint muerto devuelve [] en vez de romper la ingesta. La cadencia (cada cuántos meses se refresca cada indicador) vive junto a la fuente y se materializa en el ledger de frescura.
La compuerta de licencia (en compilación)
La regla más importante del registro no es de runtime: es de compilación. validateRegistry() rechaza cualquier fuente cuya licencia diga redistribute: false pero esté cableada a un motor que no sea provider. Republicar valores de una fuente que solo permite citar es un error de compilación, no un aviso que alguien podría ignorar. La postura de licencia de una fuente decide si sus datos aparecen como indicador republicado, solo como agregado, o solo como cita — y lo hace antes de que el build produzca un solo archivo.
Esta misma compuerta aplica a los datos aportados por terceros vía /contribuir: nada se redistribuye más allá de lo que su licencia permite. Es el mecanismo que mantiene honesto al Fideicomiso de Datos.
Las etapas de ingesta
scripts/ingest-all.ts orquesta tres etapas, cada una aislada por fallo (una etapa que falla no arrastra a las otras):
runMultisource()→ celdas deparameter-cache/+ citas. Es el grueso: el valor de cada indicador por país, con sucitation_id.runDocuments()→documents/ynews/: documentos y noticias por dimensión y país.runSignals()→ señales citadas, extraídas por LLM, ensignals/.
Al terminar, escribe refresh-meta.json. Hay ingestores de dominio adicionales para presupuesto abierto, libertad económica, libertad digital, deriva autoritaria, OGP, libertad humana, libertad de prensa, regulación, observatorio y el nivel subnacional ADM1.
El horneado (bake)
scripts/bake-all.ts transforma el cache crudo en los datasets derivados que consumen las páginas: narrativas → indicadores de frontera → subnacional → briefs y contradicciones de pulso → pronósticos → shadows → grafo de personas → puntajes compuestos → índice de mercados → _index.json. Son cerca de 50 scripts bake-*.ts: puntajes, democracia, mercados, V-Dem, exploración, insights, salud del dato, señales, coaliciones, ontología, tendencias, cívica, atención, feeds, contribuciones, soberanía de cómputo, convergencia regional, nowcast de inestabilidad, triangulación, narrativas y grafo de personas.
Ningún hecho se "hornea" dentro de un modelo: los hechos viven en los datos con su cita determinista; el horneado solo precalcula lo derivable de ellos.
Las familias de datasets (public/data/**)
El resultado son 66 familias de datos estáticos. Entre las principales:
parameters.json(las 10 dimensiones),geographies.json(25 países + LATAM, con ISO3 y M49).parameter-cache/(celdas indicador×país) yparameter-cache-adm1/(miles de celdas subnacionales).citations.json— el registro central de citas (varios MB).documents/,news/,signals/,social/,social-trends/,attention/,shadows/.personas/(perfiles +_index+_graph),state-history/,country-history/.scores.json(compuesto),data-health.json,frontier-indicators/,compute-sovereignty/,agi-economy/,dependency/,climate-action/.pulse/,regional-convergence/,subnational-convergence/,instability-nowcast/,triangulation/,uncertainty/,insights/.pilots/,pilot-archetypes/,financing-instruments/,coalitions/,positions/,cases/.regulation/,constitutional/,elections/,democracy/,transparency/,ai-governance/.markets/,metrics/,ontology/,civic/,gender-gap/,trends/.search-index.json(índice Voyage para el asistente),catalog.json,sdg-crosswalk.json,falsifications.json.
Frescura
public/data/refresh-meta.json es el ledger de frescura: por indicador guarda la fuente, la URL de la fuente, la cadencia en meses, la última fecha de refresco, el último año observado, la próxima fecha de refresco debida y cuántos países tienen dato. Es lo que hace posible mostrar el vintage de una cifra en vez de fingir que todo está al día. Las superficies /confianza e /incertidumbre leen de aquí.
Las 7 compuertas de procedencia
El prebuild corre siete comprobaciones; si cualquiera falla, el build falla y nada se despliega:
check-traced— toda cifra tiene su rastro a fuente.check-signals— las señales están bien formadas y citadas.check-source-links— los enlaces de cita apuntan al registro específico de país + indicador, nunca a una landing genérica.check-pilots— coherencia de los pilotos.check-citations— integridad del registro de citas.check-scores— coherencia de los puntajes compuestos.check-catalog— el catálogo de datasets está completo y consistente.
Estas compuertas son la razón por la que "toda cifra con su fuente" no es un eslogan sino una invariante de compilación. Cómo se resuelve una cita en pantalla se explica en Procedencia y citas.