Metodologia e honestidade
Todo o resto no Futuros — o pipeline, as citações, o assistente — existe para sustentar um único compromisso: não afirmar mais do que a evidência permite. Esta página reúne as regras e as superfícies que tornam esse compromisso verificável, não retórico. É a base de credibilidade dos quatro pilares: sem honestidade auditável, nem o fundo fiduciário atrai contribuintes nem a governança consome a inteligência.
O contrato completo, orientado ao usuário final, vive em futuros.xyz/metodologia.
O Protocolo Futuros
O protocolo é um contrato de voz que governa cada superfície:
- Cada afirmação carrega a sua fonte ou a sua etiqueta. Se há número, há citação; se é projeção, carrega a sua taxa base e o seu pressuposto declarado (
[SUPUESTO]). - Fontes em conflito não são suavizadas. Quando duas fontes divergem, mostram-se ambas e a discrepância; não se faz média em silêncio nem se escolhe a mais conveniente.
- Direto, concreto, falsificável. Sem afirmações aspiracionais sem mecanismo por trás. Um "X% de impacto" precisa de um modelo ou de um benchmark de par, não de uma intenção.
- Postura não alinhada. Crítica por igual das dependências dos EUA, da China e da UE; a região regula a partir das suas próprias tradições jurídicas.
Saúde e confiança do dado
public/data/data-health.json pontua a qualidade de cada célula pilar × país, e a superfície /confianza a expõe. A pontuação não é uma nota subjetiva — é uma fórmula publicada, implementada em scripts/bake-data-health.ts (puro node:fs: sem rede, sem LLM):
confiança = round(100 · (0,45·rastreabilidade + 0,30·frescor + 0,25·confiança_declarada))Os três componentes, com a sua fórmula exata:
| Componente | Como é calculado | Peso |
|---|---|---|
| Rastreabilidade | Indicadores da célula que carregam citation_id e vintage_year, dividido pelo total de indicadores. | 0,45 |
| Frescor | Por indicador, clamp₀₁(1 − max(0, idade − 2)/8) com idade = ano atual − vintage_year (ou o último ano da série se falta o vintage): crédito pleno até 2 anos de idade, decai linearmente, zero aos 10. A célula toma a mediana entre os seus indicadores. Deriva do vintage de cada número, não do ledger de refresh — esse é uma superfície à parte. | 0,30 |
| Confiança declarada | A da própria célula, mapeada para um fator: high→1 · medium→0,6 · low→0,3 · sem dado→0,5. | 0,25 |
Além do fator contínuo, cada célula recebe uma etiqueta pela mediana de idade dos seus vintages: fresh (≤2 anos), aging (≤5), stale (>5).
Ao redor da pontuação, a mesma camada gera (bake) três sinais a mais — e nenhum deles penaliza a confiança:
| Sinal | Regra exata |
|---|---|
| Anomalias | Sobre as variações percentuais ano a ano de cada série (mínimo 6 pontos e 5 deltas): z robusto 0,6745·(Δ − mediana)/MAD, marcada só quando abs(z) > 4 e o resíduo ≥ 10 pp. A conjunção é essencial: em séries muito estáveis o MAD é diminuto e um tremor normal dispara um z enorme — o piso absoluto o filtra. Máximo 4 por indicador e 6 por célula. Não desconta confiança: um choque real é dado real. |
| Fontes vencidas | Uma fonte está vencida quando mesmo o seu número mais fresco supera os 3 anos de idade. A worklist publica as 15 mais urgentes, ordenadas por quantos indicadores dependem de cada uma — o sinal acionável de o que reingerir primeiro. |
| Lacunas de cobertura | Um indicador é "esperado" para um pilar quando é reportado por pelo menos max(2, ⌈60%·N⌉) dos N países que têm esse pilar (presença = valor não nulo ou série com algum ponto finito). A cobertura da célula é esperados-presentes ÷ esperados; requer duas passadas sobre o corpus (contagem regional, depois pós-passada por célula). A contagem regional publica as 12 lacunas com mais países faltantes — "o que conseguir depois". A cobertura não entra na pontuação de confiança. |
Um limite deliberado do escopo: a camada de saúde pontua toda célula ready, esteja ou não em quarentena — a quarentena exclui uma célula do Índice Futuros, não do monitoramento. Uma célula em quarentena conserva a sua pontuação de confiança e as suas anomalias visíveis.
/confianza mostra essa pontuação junto ao ledger de frescor de quatro camadas de refresh-meta.json — as fontes têm namespace series: / doc: / signal: / social:, cada uma com a sua última data de refresh e a sua bandeira de vencida — mais o frescor ao vivo dos indicadores do Banco Mundial. A ideia é que o usuário possa distinguir, de relance, um indicador sólido e recente de um escasso ou velho — antes de se apoiar nele.
Incerteza e triangulação
A honestidade sobre o que não se sabe com certeza tem as suas próprias superfícies:
| Superfície | O que expõe |
|---|---|
| /confianza | Pontuações de saúde e confiança por indicador. |
| /linaje | A linhagem: origem e transformações de cada série. |
| /incertidumbre | Incerteza e vintage explícitos dos números. |
| /triangulacion | O mesmo fato contrastado entre fontes independentes. |
| /diccionario | Definições precisas de indicadores e métricas. |
| /ontologia | O grafo de entidades do ecossistema. |
A triangulação é especialmente importante: em vez de escolher uma autoridade única, o Futuros mostra como várias fontes independentes medem a mesma coisa, e onde convergem ou divergem.
Correções
public/data/falsifications.json é o log de falsificações: afirmações que foram postas à prova e, quando não se sustentaram, corrigidas. É exposto junto à metodologia de cada fonte (via SourceTrace). O compromisso é simétrico ao de citar: assim como cada número tem a sua fonte, cada afirmação refutada deixa rastro auditável da sua correção.
Honestidade quando algo não está configurado
É talvez o princípio mais distintivo: as funções degradam de forma visível, nunca fingem. Quando um backend não está configurado, a plataforma o diz em vez de simular sucesso:
- /contribuir sem armazenamento Upstash devolve um recibo com
persisted: false— o recibo é real, mas declara que não foi persistido. - /alertas sem Mailgun degrada para um
mailtohonesto em vez de prometer um envio que não vai acontecer. - /consenso sem backend degrada para votação somente-local.
- O assistente sem provedor soberano configurado usa o default de fronteira e o diz, em vez de afirmar uma soberania que não tem.
Fingir capacidade é a forma mais barata de mentir; o Futuros a proíbe por design.
Avaliação do assistente
O assistente não é julgado pela impressão de quem o experimenta: tem três arneses de avaliação, cada um com o seu comando, o seu escopo e o seu limiar:
| Arnês | O que verifica | Limiar |
|---|---|---|
bun run eval:chat (scripts/chat-eval.ts) | O contrato de grounding e profundidade contra o loop real e o corpus real: cada resposta com dados carrega pelo menos um [[cite:id]] que resolve para citações que as ferramentas realmente devolveram (sem ids inventados), o fora de tema é declinado sem citações fabricadas, as perguntas de panorama completo alcançam o piso de recuperação e fecham com pilotos, as definicionais não, e o stream sempre termina com done. | Qualquer caso reprovado faz o script falhar (exit não-zero). |
bun run eval:faithfulness (scripts/chat-faithfulness.ts) | Fidelidade no nível da afirmação: um juiz LLM contrasta cada afirmação com número da resposta contra a evidência citada, e mede a precisão de atribuição. | Gate CHAT_FAITH_MIN (default 0.85): abaixo dele, a execução falha. |
bun run eval:retrieval (scripts/eval-retrieval.ts) | Qualidade do índice semântico, sem modelo de resposta no loop: recall@1/3/5/10 e MRR sobre casos rotulados, mais a abstenção: as consultas fora do corpus devem ficar abaixo do piso de runtime (0.4, o mesmo que search.ts aplica). Uma varredura de pisos torna legível o tradeoff sobrevivência-de-positivos vs rejeição-de-negativos que justifica esse valor. | Os vazamentos do piso são reportados caso a caso. |
Dois limites, declarados com a mesma honestidade que o resto desta página exige. Primeiro, os três arneses requerem uma API key (ANTHROPIC_API_KEY ou OPENROUTER_API_KEY para os dois primeiros, VOYAGE_API_KEY para o terceiro); sem ela, eles pulam limpamente com exit 0, então são verificações pré-deploy executadas antes de qualquer mudança de prompt, modelo ou ferramentas, não um gate permanente de CI. Segundo, os seus resultados ainda não são publicados em nenhuma superfície: hoje só os vê quem os executa. Publicá-los é parte do roadmap de avaliação.
Privacidade, offline e analytics
- PWA offline-first. O app é pré-cacheado como app-shell (
/spa.html) e os dados (/data/) são servidos a partir de CDN cacheada, de modo que as superfícies funcionam sem conexão uma vez visitadas. - Analytics com postura de privacidade, e a sua exceção declarada. O rastreamento (PostHog, hospedado na sua US Cloud) está restrito ao domínio de produção (
*.futuros.xyz); não roda em previews nem em local. Isso inclui este site de documentação (docs.futuros.xyz): cada locale (ES/EN/PT) emite$pageviewe$pageleave; um token opacovia,utm_idouona URL é guardado como propriedade de pessoa/super. As entradas de texto são mascaradas na autocaptura e no replay: a navegação é medida sem ler o que o usuário digita. Os dados de contato que o usuário entrega voluntariamente viajam, sim: a comporta de preview exige um e-mail (nome e instituição opcionais) e cria um perfil identificado cujodistinct_idé o token de outreach ou um hashc_…, nunca o e-mail em claro; os formulários de /alertas, do botão de pedido de intro e de /enviar-piloto fazem o mesmo. Um hop/o/{token}pode gravar nome, instituição ou e-mail a partir deOUTREACH_ROSTER(Data, não o repo) como propriedades de pessoa. O texto de cada pergunta ao assistente viaja no servidor emchat_generatione$ai_generation. /contribuir identifica só com um pseudônimo sha-256 calculado no cliente, e o email em claro nunca chega ao analytics.
A honestidade não é uma seção à parte do produto: é a restrição que dá forma a todo o resto. Para ver como ela se materializa a montante, volte a O pipeline de dados e Proveniência e citações; para ver como o chat a herda, O assistente.