Skip to content

Metodología y honestidad

Todo lo demás en Futuros — el pipeline, las citas, el asistente — existe para sostener un solo compromiso: no afirmar más de lo que la evidencia permite. Esta página reúne las reglas y las superficies que hacen ese compromiso verificable, no retórico. Es la base de credibilidad de los cuatro pilares: sin honestidad auditable, ni el fideicomiso atrae contribuyentes ni la gobernanza consume la inteligencia.

El contrato completo, orientado al usuario final, vive en futuros.xyz/metodologia.

El Protocolo Futuros

El protocolo es un contrato de voz que gobierna cada superficie:

  • Cada afirmación lleva su fuente o su etiqueta. Si hay número, hay cita; si es proyección, lleva su tasa base y su supuesto declarado ([SUPUESTO]).
  • No se suavizan fuentes en conflicto. Cuando dos fuentes discrepan, se muestran ambas y la discrepancia; no se promedia en silencio ni se elige la más conveniente.
  • Directo, concreto, falsificable. Sin afirmaciones aspiracionales sin mecanismo detrás. Un "X% de impacto" necesita un modelo o un benchmark de par, no una intención.
  • Postura no alineada. Crítica por igual de las dependencias de EE.UU., China y la UE; la región regula desde sus propias tradiciones legales.

Salud y confianza del dato

public/data/data-health.json puntúa la calidad de cada celda pilar × país, y la superficie /confianza la expone. El puntaje no es una nota subjetiva — es una fórmula publicada, implementada en scripts/bake-data-health.ts (puro node:fs: sin red, sin LLM):

confianza = round(100 · (0,45·trazabilidad + 0,30·frescura + 0,25·confianza_declarada))

Las tres componentes, con su fórmula exacta:

ComponenteCómo se calculaPeso
TrazabilidadIndicadores de la celda que llevan citation_id y vintage_year, dividido por el total de indicadores.0,45
FrescuraPor indicador, clamp₀₁(1 − max(0, edad − 2)/8) con edad = año actual − vintage_year (o el último año de la serie si falta el vintage): crédito pleno hasta 2 años de edad, decae linealmente, cero a los 10. La celda toma la mediana entre sus indicadores. Deriva del vintage de cada cifra, no del ledger de refresco — ese es una superficie aparte.0,30
Confianza declaradaLa de la propia celda, mapeada a un factor: high→1 · medium→0,6 · low→0,3 · sin dato→0,5.0,25

Aparte del factor continuo, cada celda recibe una etiqueta por la mediana de edad de sus vintages: fresh (≤2 años), aging (≤5), stale (>5).

Alrededor del puntaje, la misma capa hornea tres señales más — y ninguna de ellas penaliza la confianza:

SeñalRegla exacta
AnomalíasSobre los cambios porcentuales año-a-año de cada serie (mínimo 6 puntos y 5 deltas): z robusto 0,6745·(Δ − mediana)/MAD, marcada solo cuando abs(z) > 4 y el residuo ≥ 10 pp. La conjunción es esencial: en series muy estables el MAD es diminuto y un temblor normal dispara un z enorme — el piso absoluto lo filtra. Máximo 4 por indicador y 6 por celda. No descuenta confianza: un shock real es dato real.
Fuentes vencidasUna fuente está vencida cuando incluso su cifra más fresca supera los 3 años de edad. La worklist publica las 15 más urgentes, ordenadas por cuántos indicadores dependen de cada una — la señal accionable de qué re-ingerir primero.
Brechas de coberturaUn indicador es "esperado" para un pilar cuando lo reporta al menos max(2, ⌈60%·N⌉) de los N países que tienen ese pilar (presencia = valor no nulo o serie con algún punto finito). La cobertura de la celda es esperados-presentes ÷ esperados; requiere dos pasadas sobre el corpus (conteo regional, luego post-pasada por celda). El conteo regional publica las 12 brechas con más países faltantes — "qué conseguir después". La cobertura no entra en el puntaje de confianza.

Un límite deliberado del alcance: la capa de salud puntúa toda celda ready, esté o no en cuarentena — la cuarentena excluye una celda del Índice Futuros, no del monitoreo. Una celda en cuarentena conserva su puntaje de confianza y sus anomalías visibles.

/confianza muestra ese puntaje junto al ledger de frescura de cuatro capas de refresh-meta.json — las fuentes se namespacen como series: / doc: / signal: / social:, cada una con su última fecha de refresco y su bandera de vencida — más la frescura en vivo de los indicadores del Banco Mundial. La idea es que el usuario pueda distinguir, de un vistazo, un indicador sólido y reciente de uno escaso o viejo — antes de apoyarse en él.

Incertidumbre y triangulación

La honestidad sobre lo que no se sabe con certeza tiene sus propias superficies:

SuperficieQué expone
/confianzaPuntajes de salud y confianza por indicador.
/linajeEl linaje: origen y transformaciones de cada serie.
/incertidumbreIncertidumbre y vintage explícitos de las cifras.
/triangulacionEl mismo hecho contrastado entre fuentes independientes.
/diccionarioDefiniciones precisas de indicadores y métricas.
/ontologiaEl grafo de entidades del ecosistema.

La triangulación es especialmente importante: en vez de elegir una autoridad única, Futuros muestra cómo varias fuentes independientes miden lo mismo, y dónde convergen o divergen.

Correcciones

public/data/falsifications.json es el log de falsificaciones: afirmaciones que fueron puestas a prueba y, cuando no se sostuvieron, corregidas. Se expone junto a la metodología de cada fuente (vía SourceTrace). El compromiso es simétrico al de citar: así como cada cifra tiene su fuente, cada afirmación refutada deja rastro auditable de su corrección.

Honestidad cuando algo no está configurado

Es quizá el principio más distintivo: las funciones degradan de forma visible, nunca fingen. Cuando un backend no está configurado, la plataforma lo dice en vez de simular éxito:

  • /contribuir sin almacén Upstash devuelve un recibo con persisted: false — el recibo es real, pero declara que no se persistió.
  • /alertas sin Mailgun degrada a un mailto honesto en vez de prometer un envío que no ocurrirá.
  • /consenso sin backend degrada a votación solo-local.
  • El asistente sin proveedor soberano configurado usa el default de frontera y lo dice, en vez de afirmar una soberanía que no tiene.

Fingir capacidad es la forma más barata de mentir; Futuros la prohíbe por diseño.

Evaluación del asistente

El asistente no se evalúa con la impresión de quien lo prueba: tiene tres arneses de evaluación, cada uno con su comando, su alcance y su umbral:

ArnésQué verificaUmbral
bun run eval:chat (scripts/chat-eval.ts)El contrato de grounding y profundidad contra el loop real y el corpus real: cada respuesta con datos lleva al menos un [[cite:id]] que resuelve a citas que las herramientas realmente devolvieron (sin ids inventados), lo fuera de tema se declina sin citas fabricadas, las preguntas de panorama completo alcanzan el piso de recuperación y cierran con pilotos, las definicionales no lo hacen, y el stream siempre termina con done.Cualquier caso fallido hace fallar el script (exit no-cero).
bun run eval:faithfulness (scripts/chat-faithfulness.ts)Fidelidad a nivel de afirmación: un juez LLM contrasta cada afirmación con cifra de la respuesta contra la evidencia citada, y mide la precisión de atribución.Gate CHAT_FAITH_MIN (default 0.85): por debajo, falla.
bun run eval:retrieval (scripts/eval-retrieval.ts)Calidad del índice semántico, sin modelo de respuesta en el loop: recall@1/3/5/10 y MRR sobre casos etiquetados, más la abstención: las consultas fuera de corpus deben quedar por debajo del piso de runtime (0.4, el mismo que aplica search.ts). Un barrido de pisos hace legible el tradeoff supervivencia-de-positivos vs rechazo-de-negativos que justifica ese valor.Las fugas del piso se reportan caso por caso.

Dos límites, declarados con la misma honestidad que exige el resto de la página. Primero, los tres arneses requieren una API key (ANTHROPIC_API_KEY u OPENROUTER_API_KEY para los dos primeros, VOYAGE_API_KEY para el tercero); sin ella se saltan limpiamente con exit 0, así que son verificaciones pre-despliegue que se corren antes de cambiar prompt, modelo o herramientas, no un gate permanente de CI. Segundo, sus resultados todavía no se publican en ninguna superficie: hoy solo los ve quien los corre. Publicarlos es parte de la hoja de ruta de evaluación.

Privacidad, offline y analítica

  • PWA offline-first. La app se precachea como app-shell (/spa.html) y los datos (/data/) se sirven desde CDN cacheada, de modo que las superficies funcionan sin conexión una vez visitadas.
  • Analítica con postura de privacidad, y su excepción declarada. El seguimiento (PostHog, alojado en su US Cloud) está restringido al dominio de producción (*.futuros.xyz); no corre en previews ni en local. Incluye este sitio de documentación (docs.futuros.xyz): cada locale (ES/EN/PT) emite $pageview y $pageleave; un token opaco via, utm_id u o en la URL se guarda como propiedad de persona/super. Las entradas de texto se enmascaran en la autocaptura y en el replay: la navegación se mide sin leer lo que el usuario escribe. Los datos de contacto que el usuario entrega voluntariamente sí viajan: la compuerta de preview exige un correo (nombre e institución opcionales) y crea un perfil identificado cuyo distinct_id es el token de outreach o un hash c_…, nunca el correo en claro; los formularios de /alertas, de solicitud de intro y de /enviar-piloto hacen lo mismo. Un hop /o/{token} puede escribir nombre, institución o correo desde OUTREACH_ROSTER (Data, no el repo) como propiedades de persona. El texto de cada pregunta al asistente viaja del lado del servidor en chat_generation y $ai_generation. /contribuir identifica solo con un seudónimo sha-256 calculado en el cliente, y el email en claro nunca llega a la analítica.

La honestidad no es una sección aparte del producto: es la restricción que le da forma a todo el resto. Para ver cómo se materializa aguas arriba, vuelve a El pipeline de datos y Procedencia y citas; para ver cómo la hereda el chat, El asistente.

Cada cifra con su fuente — la trazabilidad es el contrato.