Batería del engine — resultados y hallazgos

Fecha: 2026-09-22. Proyecto: nef-silo (~/nef/nef-silo). Batería: tests/bateria.py (uso en tests/README.md). Corrida de referencia: data/bateria/scorecard-20260922T184103Z.md (n=12, 7 días).

Métrica clave: lograr datos relevantes. Hoy, sin profundidad: 20% (grafo, IDF) / 8.9% (perfil curado). Con texto completo: 90% / 70% en la muestra. El cuello no es el ranking (top-20 = 100%) sino la señal: falta el texto.

Resultados

probevalorveredicto
t0 contenido RSScobertura 65% · 5,626 chok
t1 trafilaturaéxito 83.3% · 4,180 ch · 1.4 sok
t2 paywall local128 docs · 8,079 ch · 123 vistosok
t3 lift profundidadtitular 50% → texto 90% · perfil 0% → 70%ok
perspectivasitems calificados 2.9% · cred 9 · bucket mayor 74.4%bajo
relevanciagrafo 20% · perfil 8.9% · top20 100%crítico
saboresflash 57 fuentes · coverage 55ok
unfetchsolape 100% · solo surtido 0 (en la ventana del engine)ok

Hallazgos

  1. La profundidad es el multiplicador. t3: extraer texto sube el match del grafo +40 pt y el del perfil +70 pt. T0 (contenido en el feed) cubre 65% de las entradas sin pedir nada; T1 (trafilatura en el server) 83% de éxito; T2 ya existe local. El “archivo total” por tiers queda justificado por datos.
  2. El ranking ya sirve; la señal no. Precisión top-20 = 100% con términos específicos (IDF 0.5%). Sin texto, solo 1 de cada 5 items toca el grafo.
  3. Perspectivas no medibles aún. El índice cubre medios independientes MX/EEUU (26) + 65 canales de YouTube; faltan los grandes que dominan el volumen (NYT, WaPo, Al Jazeera, TechCrunch, ITHome, 36kr, HN, Techmeme…). Por eso solo 2.9% de items tienen rating. Acción F1: extender el índice y verificar MBFC.
  4. “Un fetch” es viable hoy. En la ventana de vida del engine, el solape con surtido/reporte/feed-todo.json es 100% (0 items solo-surtido). El 51% inicial era artefacto de comparar contra historia previa al engine.
  5. Sabores viables. 57 fuentes caen en flash (X/TG + RSS ≥25/día) y 55 en coverage; el scheduler multi-cadencia tiene masa crítica.
  6. Bugs encontrados y corregidos:
    • duplicados inflado: toda URL ya conocida re-vista se registraba como duplicado (3,243 de 4,416). Fix en capturar: set urls_db + contador repetidos (visible en estado.json).
    • _estado_fuente hardcodeaba columnas y descartaba las nuevas (mejora 7).
    • Batería: IDF sin filtrar (umbral 2%→0.5%), vistos.json con forma {"urls":[...]}, unfetch sin ventana temporal, tasa de t2 mal calculada.

Decisiones que habilita

  • F1 empieza por lo barato y de mayor palanca: T0 (guardar content:encoded/summary al insertar) + importar ratings al registro.
  • F2.5 archivo total por tiers con presupuesto: T0 universal, T1 server, T2/T3 local-only (privacidad de prensa intacta).
  • KPI de balance de perspectivas queda condicionado a extender el índice de ratings (no se puede medir lo que no está calificado).

Pendientes

  • Extender indice-credibilidad.json con los ~25 medios de mayor volumen sin rating (verificar MBFC/NewsGuard; regla: nunca dar un rating por bueno).
  • Correr la batería desde el Linode (T0/T1 con la red del server) y con n≥25.
  • Afinar IDF con más corpus (hoy descarta genéricos como open/agent/world/data).
  • Guardar un mini gold set de 50 items para medir precisión de relevancia con criterio humano, no solo match de términos.