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:
| Componente | Cómo se calcula | Peso |
|---|---|---|
| Trazabilidad | Indicadores de la celda que llevan citation_id y vintage_year, dividido por el total de indicadores. | 0,45 |
| Frescura | Por 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 declarada | La 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ñal | Regla exacta |
|---|---|
| Anomalías | Sobre 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 vencidas | Una 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 cobertura | Un 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:
| Superficie | Qué expone |
|---|---|
| /confianza | Puntajes de salud y confianza por indicador. |
| /linaje | El linaje: origen y transformaciones de cada serie. |
| /incertidumbre | Incertidumbre y vintage explícitos de las cifras. |
| /triangulacion | El mismo hecho contrastado entre fuentes independientes. |
| /diccionario | Definiciones precisas de indicadores y métricas. |
| /ontologia | El 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
mailtohonesto 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és | Qué verifica | Umbral |
|---|---|---|
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$pageviewy$pageleave; un token opacovia,utm_iduoen 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 cuyodistinct_ides el token de outreach o un hashc_…, 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 desdeOUTREACH_ROSTER(Data, no el repo) como propiedades de persona. El texto de cada pregunta al asistente viaja del lado del servidor enchat_generationy$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.